"explicit"关键字用于修改复制构造函数可能会导致问题。作为函数参数传递的对象特别容易受到这些问题的影响。
以下是我的代码:
以下是我的代码:
#include <iostream>
#include <string>
class Pig{
public:
std::string _name;
public:
Pig(std::string n) : _name(n) {}
//~Pig() = default;
explicit Pig(const Pig &other) {
std::cout << "copy ctor!" << std::endl;
this->_name = other._name;
}
};
void show(Pig p) {
std::cout << p._name << std::endl;
}
int main() {
Pig pig{std::string("hello")};
show(Pig{pig}); // no pass
// show(Pig(pig)); // no pass
return 0;
}
编译器版本:g++(Ubuntu 9.4.0-1ubuntu1〜20.04.1)9.4.0。
上述代码无法使用c++14或更低版本编译,但可以成功使用c++17及更高版本编译。
以下是编译器的错误:
test.cpp: In function ‘int main()’:
test.cpp:22:7: error: cannot convert ‘Pig’ to ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’}
22 | show(Pig{pig}); // 不通过
| ^~~~~~~~
| |
| Pig
- 我知道如何使用显式,我想显式调用复制构造函数以使其正常工作。
提前致谢!
我尝试使用c++14和c++17编译。
void show(Pig const& p)
作为函数的签名... - fabianPig
作为右值引用传递到 show 中来修复它。我不知道通过值传递 rvalue 的规则有什么区别... - Dharmesh946Pig{pig}
创建的临时对象的引用,在另一种情况下,您将需要从该临时对象中复制构造函数参数值; 对于 >= C++17,此复制已被删除,因为进行了复制省略。 - fabian