我发现 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:
在初始化中,如果初始化表达式是一个prvalue,并且源类型的cv-unqualified版本与目标类是同一个类,则初始化表达式用于初始化目标对象:
T x = T(T(T())); // only one call to default constructor of T, to initialize x
所以我认为它应该等于const Movable y{};
。怎么了?