【发布时间】:2017-12-19 06:14:41
【问题描述】:
考虑以下示例:
class X {
public:
X() = default;
X(const X&) = default;
X(X&&) = delete;
};
X foo() {
X result;
return result;
}
int main() {
foo();
}
Clang 和 GCC 对这个程序是否有效存在分歧。 GCC 在调用foo() 期间初始化临时构造函数时尝试调用移动构造函数,该构造函数已被删除导致编译错误。即使使用-fno-elide-constructors,Clang 也能很好地处理这个问题。
谁能解释为什么在这种情况下允许 GCC 调用移动构造函数? result 不是左值吗?
【问题讨论】:
-
如果使用 c++17 编译,gcc 的行为会改变吗?
-
您使用的是 C++ 11、14 还是 17? (GCC 和 Clang 也一样?)
-
@IgorR 没有。
-
@RayToal 观察到所有三个版本的行为。
标签: c++ language-lawyer c++17