我不知道make_optional是如何实现的,因为目前的C 1z草案就是如此.有关说明,请参阅this post.是否有一些解决方法,或者它只是标准草案/ cppreference的错误?
解决方法 感谢@Yakk和@ T.C.他们的解释.我觉得一个例子应该让事情更清楚: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}
因此make_wrapper成功返回constexpr包装器;它是复制/移动构造(尽管通常由编译器省略),它阻止代码编译,因为没有constexpr复制/移动构造函数.
我们可以通过使用其成员值初始化constexpr变量来验证返回(临时)包装器对象的constexpr-ness.
总结以上是内存溢出为你收集整理的C 17 make_optional constexpr-ness全部内容,希望文章能够帮你解决C 17 make_optional constexpr-ness所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)