感谢@Yakk 和@TC 的解释。我觉得一个例子应该能让事情更清楚:
struct wrapper {
int value;
// non-explicit constexpr constructor
constexpr wrapper(int v) noexcept : value(v) {}
// non-constexpr copy & move constructors
wrapper(const wrapper& that) noexcept : value(that.value) {}
wrapper(wrapper&& that) noexcept : value(that.value) {}
};
constexpr wrapper make_wrapper(int v)
{
return {v};
}
int main()
{
constexpr auto x = make_wrapper(123); // error! copy/move construction,
// but no constexpr copy/move ctor
constexpr int y = make_wrapper(123).value; // ok
static_assert(y == 123, ""); // passed
}
Run Code Online (Sandbox Code Playgroud)
所以make_wrapper成功返回了constexpr wrapper; 由于没有复制/移动构造函数,因此阻止代码编译的是constexpr复制/移动构造(尽管通常被编译器忽略)。
我们可以通过使用constexpr返回的(临时)对象的成员值来初始化变量来验证其状态。wrapperconstexpr
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |