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