C ++标准说(12.8 / 9):
如果类
时,将隐式声明一个默认值。X
的定义未明确声明移动构造函数,则当且仅当
X
没有用户声明的复制构造函数,X
没有用户声明的副本分配运算符X
没有用户声明的移动赋值运算符和X
没有用户声明的析构函数。
但是下面的代码(用clang++ 3.8.0 and g++ 6.3.0编译)给出了一个空输出:
#include <iostream>
struct Foo
{
Foo() = default;
Foo(const Foo&)
{
std::cout << "Copy constructor" << std::endl;
}
};
int main()
{
Foo foo{Foo{}};
(void)foo;
}
在 clang ++ 和 g ++ 中是否存在问题?
更新。在评论中注明@Piotr Skotnicki,copy elision发生在此处。命令行键-fno-elide-constructors
disables it for constructors in clang++ and g++。