【发布时间】:2021-12-12 12:44:46
【问题描述】:
我有这个代码
class MyString {
public:
MyString();
MyString(const char*);
MyString(const String&);
MyString(String&&) noexcept;
...
};
String::String()
{
std::cout << "default construct!" <<std::endl;
}
String::String(const char* cb)
{
std::cout << "construct with C-char!" <<std::endl;
...
}
String::String(const String& str)
{
std::cout << "copy construct!" <<std::endl;
...
}
String::String(String&& str) noexcept
{
std::cout << "move construct!" <<std::endl;
...
}
在main()
MyString s1(MyString("test"));
我认为结果会是这样的:
用 C-char 构造! 调用 移动构造!
但我得到的是这样的:
用 C-char 构造!
我想的步骤
-
MyString("test")使用带有char*的构造函数构造一个右值 - 构造 s1(arg)
- 由于arg是右值,s1应该由move构造函数构造
但我发现没有
std::move就不会调用移动构造函数。
为什么会这样?
如何在没有std::move()的情况下使用移动构造函数?
编译器:
Gnu C++ 9.3.0
【问题讨论】:
-
我相信在这种情况下复制省略是强制性的。
-
@Mechap:仅从 C++17 开始。
-
您缺少的概念是“复制省略”。见this question。
-
您的推理是正确的,您可以使用
-fno-elide-constructor标志来关闭该优化。 -
@Jarod42 仅在标准的旧版本中,它只是一个优化。您不能在 C++17 或更高版本中禁用该行为。
标签: c++ c++11 constructor