考虑以下代码:
struct NonMovable {
NonMovable() = default;
NonMovable(const NonMovable&) = default;
NonMovable(NonMovable&&) = delete;
};
NonMovable f() {
NonMovable nonMovable;
return {nonMovable};
//return NonMovable(nonMovable);
}
int main() {}
Run Code Online (Sandbox Code Playgroud)
GCC 和 Clang 编译该代码没有错误,即在使用大括号时调用了复制构造函数。但是 msvc 拒绝它https://godbolt.org/z/49onKj并出现错误:
Run Code Online (Sandbox Code Playgroud)error C2280: 'NonMovable::NonMovable(NonMovable &&)': attempting to reference a deleted function
当我指定显式调用复制构造函数(因为nonMovable不是右值)时,mvsc 接受代码。
谁是对的?在return {var};那里的语句中应该调用什么类型的构造函数?