2011-10-03 8 views
20

'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

+2

+1 (मुझे लगता है) एक प्रश्न के लिए अभी भी मुझे 2 मिनट के बाद कोई सुराग नहीं है – sehe

+0

क्या यह 'std :: cout' के साथ एक ही समस्या नहीं है? –

+1

@ केरेक 'std :: cout' कई बार परिभाषित नहीं किया गया है। यह सिर्फ अपने संबंधित शीर्षकों में घोषित किया गया है। –

उत्तर

6

ऐसा लगता है कि आप पहले से ही है कि बढ़ावा मेलिंग सूची पोस्टिंग में अपना जवाब दिया है। हां, मेरी राय में यह अनिर्धारित व्यवहार है या कम से कम परिभाषित व्यवहार पर्याप्त रूप से स्पष्ट नहीं है।

इसी मामले पर चर्चा के लिए this usenet discussion देखें।

+0

आपके उत्तर के लिए धन्यवाद। – iorate

+0

मुझे ऐसा भी लगता है। वैसे, बूस्ट के विपरीत, मानक लाइब्रेरी के लिए केवल हेडर होने की आवश्यकता नहीं है। इसलिए 'piecewise_construct' को घोषित किया जाना चाहिए था: 'बाहरी const const piecewise_construct_t piecewise_construct; '। मुझे आश्चर्य है कि यह क्यों नहीं था। – iorate

+0

मैं comp.std.C++ या comp.lang.C++ पर पूछने की सलाह देता हूं। –

0

आईएमएचओ ओडीआर के तहत कोई संघर्ष नहीं है।

एक अज्ञात नेमस्पेस का आंतरिक प्रभाव (स्थिर) के लिए चीजों को चिह्नित करने के समान प्रभाव पड़ता है। इसका वास्तव में यह अर्थ है कि प्रत्येक टीयू इस तरह के प्रकार/कार्यों के लिए अपनी अनूठी परिभाषाओं का उपयोग करता है।

तरह से मैं उनकी ओर देखो, कैसे प्लेसहोल्डर (:::: _ 1 और जायके प्रतिस्पर्धा) काम करते हैं, compiletime प्रकार निष्कर्ष के रूप में इतना इन्स्टेन्शियशन द्वारा नहीं है:

_1, _2 आदि केवल प्लेसहोल्डर हैं , और उन्हें वास्तव में संगत होने की आवश्यकता नहीं है (मूल्यों को एक टीयू से दूसरे में पारित करने की आवश्यकता नहीं है, उन्हें प्रकार के अनुमानित पैरामीटर टाइप किया गया है और जैसे उनके वास्तविक प्रकार का अनुमान है identity मौजूदा टीयू से)।

आईओओ: आप कुछ विशेषताओं को विशेषज्ञता देकर आसानी से अपने स्वयं के प्लेसहोल्डर्स को परिभाषित कर सकते हैं, और उन्हें अभी भी एक आकर्षण की तरह काम करना चाहिए।

namespace boost 
{ 
    template<int I> struct is_placeholder< 
      my_funny_own_placeholder_no_ODR_involved<I> > 
    { 
     enum _vt { value = I }; 
    }; 
} 

मुझे लगता है कि एक ही तर्क टुकड़े के टुकड़े के लिए हो सकता है (लेकिन मैंने उस पर बहुत कुछ नहीं देखा है)।

+0

'समस्या' यह है कि जब टीयू दोनों पर विचार करते हैं, तो 'एफ' की संबंधित परिभाषाएं अलग होती हैं क्योंकि वे उसी 'std :: piecewise_construct' का संदर्भ नहीं लेते हैं और पता का उपयोग किया जाता है, मूल्य नहीं। इस प्रकार संभावित ओडीआर उल्लंघन यह है कि प्रत्येक टीयू में 'एफ' अलग हो सकता है। जोहान्स द्वारा जुड़ी चर्चा में उपलब्ध अधिक जानकारी। –

+0

@LucDanton: यह एक समस्या कैसी है? वे अलग-अलग नामों के नामों में बस अलग-अलग कार्य हैं? ध्यान दें कि मैं मुख्य रूप से _1, _2 ... प्लेसहोल्डर के बारे में जुड़ी चर्चा से इसे रोक रहा हूं। मैं टुकड़े की दिशा के बारे में जुड़ी चर्चा में पढ़ूंगा ... बाद में – sehe

+0

'f' एक अनाम नामस्थान में नहीं है। यदि यह थे, तो आप सही हैं कि कोई समस्या नहीं होगी। –

संबंधित मुद्दे