अद्यतन: मैं नीचे मेरे अपने उत्तर पोस्ट और वहाँ यहाँ इस मामले की एक लंबी संस्करण है: http://scrupulousabstractions.tumblr.com/post/38460349771/c-11-type-safe-use-of-integer-user-defined-literalsसंकलन समय जैसे रूपांतरण की जांच (constexpr और उपयोगकर्ता परिभाषित शाब्दिक)
प्रश्न:
मैं हमने एक सरल constexpr
उपयोगकर्ता को शाब्दिक _X
परिभाषित किया है जो मान को एक लंबे समय तक हस्ताक्षरित के रूप में प्राप्त करता है (इस प्रकार संख्यात्मक उपयोगकर्ता परिभाषित अक्षर: http://en.cppreference.com/w/cpp/language/user_literal), और फिर मैं सुनिश्चित करता हूं कि मान लंबे समय तक हस्ताक्षरित हो।
यह सब अच्छी तरह से काम करता है (बहुत बड़ा मान संकलन त्रुटि के कारण), लेकिन केवल जब मैं स्पष्ट रूप से एक चर बनाने जैसे
constexpr auto a= 150_X;
, तो इसके बजाय मैं कुछ विशिष्ट प्रकार लिख
cout << 150_X << endl;;
परीक्षण संकलन समय पर प्रदर्शन नहीं किया जाता है।
constexpr कार्यों केवल संकलन समय पर क्रियान्वित कर रहे हैं अगर वे एक constexpr चर के लिए आवंटित कर रहे हैं? (मुझे मानक में यह नहीं मिला)
क्या
_X
का सुरक्षित व्यवहार प्राप्त करना संभव है जो मैं ढूंढ रहा हूं?
पूर्ण उदाहरण:
#include<iostream>
#include<stdexcept>
inline constexpr long long testConv(unsigned long long v) {
return (v > 100) ? throw std::exception() : v;
} // will eventually use actual limit from numeric_limits
inline constexpr long long operator "" _X(unsigned long long f) {
return testConv(f) ;
}
int main(){
constexpr auto a= 5_X;
std::cout << a << std::endl;
std::cout << 200_X << std::endl; // This bad literal is accepted at compile time
constexpr auto c=250_X; // This bad literal is not accepted at compile time
std::cout << c << std::endl;
}
ओह, संदर्भ के लिए: मैं gcc4.7.2 इस्तेमाल किया।
ग्रेट उत्तर, और विस्तारित लेखन के लिए भी धन्यवाद! बहुत उपयोगी। – U007D
यह, ज़ाहिर है, केवल तब तक काम करता है जब तक शाब्दिक कभी अष्ट या हेक्साडेसिमल नहीं होता है। इन मामलों में, विभिन्न शाब्दिक पार्सर की आवश्यकता होगी। – nshct