'std :: piecewise_construct', < उपयोगिता > में परिभाषित, आंतरिक संबंध है क्योंकि इसे कॉन्स्टेक्सर घोषित किया गया है। मुझे आश्चर्य है कि हेडर में 'std :: piecewise_construct' का उपयोग ओडीआर का उल्लंघन कर सकता है। उदाहरण के लिए:std :: piecewise_construct एक ओडीआर उल्लंघन का कारण नहीं है?
// a.hpp
#include <utility>
#include <tuple>
struct point
{
point(int x, int y)
: x(x), y(y)
{}
int x, y;
};
inline std::pair<point, point> f(int x1, int y1, int x2, int y2)
{
return {
std::piecewise_construct,
std::forward_as_tuple(x1, y1), std::forward_as_tuple(x2, y2)
};
}
// translation unit 1
#include "a.hpp"
// translation unit 2
#include "a.hpp"
टीयू 1 में 'एफ' में 'std :: piecewise_construct' मुझे लगता है 'एफ' ओडीआर का उल्लंघन करती है टीयू 2 में 'एफ' में है कि तुलना में एक अलग वस्तु को दर्शाता है।
N3290 (शायद आईएसओ/आईईसी 14882: 2011 भी) का कहना है निम्नलिखित मामला है, ओडीआर का एक अपवाद है में 3.2/5:
एक नाम आंतरिक या कोई संबंध है, तो साथ एक स्थिरांक वस्तु का उल्लेख कर सकते ऑब्जेक्ट में डी की सभी परिभाषाओं में एक ही शाब्दिक प्रकार होता है, और ऑब्जेक्ट को निरंतर अभिव्यक्ति (5.1 9) के साथ प्रारंभ किया जाता है, और ऑब्जेक्ट का मान (लेकिन पता नहीं) का उपयोग किया जाता है, और ऑब्जेक्ट में वही मान होता है डी की परिभाषाएं;
'एफ' लगभग सभी आवश्यकताओं को पूरा करता है, लेकिन "वस्तु का मूल्य (लेकिन पता नहीं) का उपयोग किया जाता है" मेरे लिए संदिग्ध लगता है। यह सच है कि 'std :: piecewise_construct_t' का कोई राज्य नहीं है, लेकिन 'std :: pair' के टुकड़े के कन्स्ट्रक्टर के कॉल में 'std :: piecewise_construct_t' के निहित घोषित प्रतिलिपि निर्माता का कॉल शामिल है, जिसका तर्क 'const std :: piecewise_construct_t & '। पता "इस्तेमाल किया गया" है, है ना?
मैं बहुत परेशान हूं।
संदर्भ: http://lists.boost.org/Archives/boost/2007/06/123353.php
+1 (मुझे लगता है) एक प्रश्न के लिए अभी भी मुझे 2 मिनट के बाद कोई सुराग नहीं है – sehe
क्या यह 'std :: cout' के साथ एक ही समस्या नहीं है? –
@ केरेक 'std :: cout' कई बार परिभाषित नहीं किया गया है। यह सिर्फ अपने संबंधित शीर्षकों में घोषित किया गया है। –