大佬教程收集整理的这篇文章主要介绍了c – 如果基类包含数组成员,派生类的构造函数不能是constexpr,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当基类没有数组成员时,这很好用.但是,当我添加一个数组时,派生值不能再是constexPR.但是,基类的简单副本确实会产生constexpr结果.
TEST.CPP
#define USE_ARRAY struct SFoo { constexpr SFoo() =default; constexpr SFoo(SFoo const&) =default; constexpr SFoo(SFoo &) =default; constexpr SFoo(SFoo &&) =default; constexpr SFoo& operator = (SFoo const&) =default; constexpr SFoo& operator = (SFoo &) =default; constexpr SFoo& operator = (SFoo &&) =default; # ifdef USE_ARRAY constexpr SFoo(int const (&array)[1]) : M_array{array[0]} {} int M_arraY[1] = {0}; # else constexpr SFoo(int value) : M_value{value} {} int M_value = 0; # endif }; struct SBar : SFoo { constexpr SBar() =default; constexpr SBar(SBar const&) =default; constexpr SBar(SBar &) =default; constexpr SBar(SBar &&) =default; constexpr SBar& operator = (SBar const&) =default; constexpr SBar& operator = (SBar &) =default; constexpr SBar& operator = (SBar &&) =default; constexpr SBar(SFoo foo) : SFoo(foo) {} }; // Instances: # ifdef USE_ARRAY constexpr int arg[1] = {3}; # else constexpr int arg = 3; # endif constexpr SFoo foo(arg); // base "value" constructor is constexPR. constexpr SFoo foo2(foo); // base copy constructor is constexPR. constexpr SBar bar(foo); // (line 54): this line fails.
用…编译
clang++ -std=c++1z -c -o test.o test.cpp
产量
test.cpp:54:16: error: constexpr variable 'bar' must be initialized by a constant expression constexpr SBar bar(foo); ^~~~~~~~ 1 error generated.
但是,如果我没有定义USE_ARRAY,一切都有效.
有谁知道为什么会这样?
(我知道std :: array可以提供帮助,但我宁愿使用本机数组并理解底层问题).
constexpr SBar(SFoo foo) : SFoo(foo) {}
通过const引用获取foo:
constexpr SBar(const SFoo &info) : SFoo(info) {}
//constexpr SFoo(SFoo &) =default;
我没有立即看到C 1z标准草案中的语言使这种变化有意义.
另一方面,gcc抱怨复制构造函数说隐式定义不是constexpr(see it live),例如:
error: explicitly defaulted function 'constexpr SFoo& SFoo::operator=(const SFoo&)' cAnnot be declared as constexpr because the implicit declaration is not constexpr constexpr SFoo& operator = (SFoo const&) =default; ^
以上是大佬教程为你收集整理的c – 如果基类包含数组成员,派生类的构造函数不能是constexpr全部内容,希望文章能够帮你解决c – 如果基类包含数组成员,派生类的构造函数不能是constexpr所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。