【发布时间】:2016-03-09 21:38:15
【问题描述】:
我想定义派生类型 (SBar) 的 constexpr 值,使用其唯一参数是基类 (SFoo) 的变量的构造函数,它只是用于初始化基类。
当基类没有数组成员时,这可以正常工作。但是,当我添加一个数组时,派生值不能再是 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 可以提供帮助,但我宁愿使用原生数组并了解潜在问题)。
【问题讨论】:
标签: c++ arrays inheritance constexpr c++17