मैं नीचे दिए गए कोड, कि मूल रूप से संकलन समय पर एक std::array<>
में एक std::integer_sequence<>
नक्शे है संकलन नहीं करता है:क्यों स्थिरांक संदर्भ कार्यों द्वारा constexpr वस्तु गुजर, लेकिन मूल्य द्वारा
#include <iostream>
#include <utility>
#include <array>
template<int...Is>
constexpr auto make_array(const std::integer_sequence<int, Is...>& param) // this works */
// constexpr auto make_array(std::integer_sequence<int, Is...> param) // doesn't compile
{
return std::array<int, sizeof...(Is)> {Is...};
}
int main()
{
constexpr std::integer_sequence<int, 1,2,3,4> iseq;
// If I pass by value, error: the value of 'iseq' is not usable in a constant expression
constexpr auto arr = make_array(iseq);
for(auto elem: arr)
std::cout << elem << " ";
}
कोड ठीक काम करता है जब भी make_array
const
-reference द्वारा इसकी तर्क लेता है। जब भी मैं इसे मूल्य से गुजरने की कोशिश करता हूं, जैसे टिप्पणी पंक्ति में, यह एक त्रुटि थूकता है:
error: the value of 'iseq' is not usable in a constant expression
constexpr auto arr = make_array(iseq);
यह क्यों है? पैरामीटर iseq
निश्चित रूप से निरंतर अभिव्यक्ति है, मैं इसे make_array
पर क्यों नहीं भेज सकता?
#include <iostream>
#include <utility>
struct Foo
{
int _m;
constexpr Foo(int m): _m(m){};
};
constexpr Foo factory_foo(int m)
{
return Foo{m};
}
constexpr Foo copy_foo(Foo foo)
{
return foo;
}
int main()
{
constexpr Foo cxfoo = factory_foo(42);
constexpr Foo cpfoo = copy_foo(cxfoo);
}
संपादित
मैं macports से जी ++ 5.1 का उपयोग कर रहा:
उदाहरण के लिए, नीचे दिए गए कोड अपेक्षा के मूल्य से गुजर काम करता है। बजना ++ 3.5 का उपयोग करना, मैं भी कोड है कि ++ (const
संदर्भ के साथ) जी के साथ संकलित के लिए एक त्रुटि संदेश मिलता है:
error: default initialization of an object of const type 'const std::integer_sequence' requires a user-provided default constructor
इसलिए मुझे लगता है कि एक उपयोगकर्ता द्वारा प्रदान की डिफ़ॉल्ट निर्माता की कमी के साथ कुछ समस्या है, लेकिन कम से इस बिंदु पर मैं वास्तव में समझ नहीं पा रहा हूं कि क्या हो रहा है।
कौन सा कंपाइलर और संस्करण (ओं)। –
@ShafikYaghmour g ++ 5.1, जल्द ही क्लैंग पर आज़माएगा। अद्यतन संपादन देखें, clang ++ 'const' संदर्भ से गुज़रने के मामले में भी एक त्रुटि थूक रहा है। मैं शायद निरंतर अभिव्यक्तियों में डिफ़ॉल्ट-ctors के बारे में कुछ याद कर रहा हूँ। – vsoftco