【发布时间】:2016-10-07 15:32:24
【问题描述】:
我发现 GCC 7 已经实现了保证复制省略,我在wandbox 中尝试了以下代码:
#include <iostream>
struct NonMovable
{
NonMovable() noexcept = default;
NonMovable(NonMovable&&) noexcept = delete;
NonMovable& operator=(NonMovable&&) noexcept = delete;
};
NonMovable Make()
{
return {};
}
int main()
{
//[[maybe_unused]] const auto x = Make();
//const auto z = NonMovable{};
[[maybe_unused]] const auto y = NonMovable{NonMovable{}};
}
我得到了编译错误:
prog.cc: In function 'int main()':
prog.cc:20:60: error: use of deleted function 'NonMovable::NonMovable(NonMovable&&)'
[[maybe_unused]] const auto y = NonMovable{NonMovable{}};
^
prog.cc:6:5: note: declared here
NonMovable(NonMovable&&) noexcept = delete;
^~~~~~~~~~
根据cppreference:
在初始化时,如果初始化表达式是纯右值并且 源类型的 cv 非限定版本与 目标的类,初始化表达式用于 初始化目标对象:
T x = T(T(T())); // only one call to default constructor of T, to initialize x
所以我认为它应该等于const Movable y{};。怎么了?
【问题讨论】:
-
看来是GCC的bug。该代码在新版本的 GCC 上编译良好。
标签: c++ gcc c++17 copy-elision