使用复制构造函数进行隐式类类型转换
Do implicit class-type conversions use the copy-constructor?
以下引用自我的c++书:
使用直接初始化时,要求编译器使用普通的函数匹配来选择与实参最匹配的构造函数我们提供。当使用复制初始化时,我们要求编译器进行复制将右操作数转换为正在创建的对象,将该操作数转换为if必要的。
对我来说,这个固定的位产生了一点歧义。这听起来像是将右操作数转换为类类型,然后使用复制构造函数,例如;
string s = "hello";
将成为…
string s = string("hello");
,它使用复制构造函数。如果这是真的,那么我的测试程序;
#include <iostream>
using namespace std;
class A{
public:
A(const A& b): data(b.data) { cout << "The first way" << endl;}
A(const char* c): data(c) { cout << "The second way" << endl;}
string data;
};
int main(){
A first("hello");
A second = "sup";
}
应该产生"The second way, The second way, The first way"。然而,它却打印出"The second way, The second way"。从这里我可以得出结论,它使用的是const char*构造函数,而不是复制构造函数。我可以这样做,但后来它说…
在复制初始化过程中,编译器允许(但没有义务)跳过复制/移动构造函数,直接创建对象。也就是说,允许编译器重写
string null_book = "9-999-99999-9";
到
然而,即使编译器省略了对复制/移动构造函数的调用复制/移动构造函数必须存在,并且必须在程序的那一点上是可访问的(例如,不是私有的)。string null_book("9-999-99999-9");
我不确定为什么在这些例子中需要提到复制构造函数,不是吗
string null_book = "9-999-99999-9"
总是隐式地意味着无论如何都要使用const char*构造函数?实际上,对我来说,为了上面的工作需要定义复制构造函数是没有意义的。但是,如果我将"const &"构造函数设置为私有(其余部分设置为公共),那么我的程序将无法运行。为什么必须为甚至不涉及复制构造函数的隐式转换定义复制构造函数?"string null_book = "9-999-99999-9"使用什么构造函数?
string null_book = "9-999-99999-9";
即string null_book = string("9-999-99999-9");
。
使用const char *
构造函数构造临时对象,然后null_book
是从临时对象中复制/移动构造的,然后销毁临时对象。
(复制/移动构造表示在可用的情况下使用移动构造函数;否则为复制构造函数)。
然而,此场景也符合复制省略的条件。你实际上在你的问题中引用了副本省略规范,所以我就不再重复了。
编译器可以选择为null_book
和临时对象使用相同的内存空间,并且省略对临时对象析构函数和null_book
复制/移动构造函数的调用。
在您的例子中,编译器确实选择这样做,这就是为什么您没有看到任何复制构造函数输出。
一些编译器允许通过开关禁用拷贝省略,例如gcc/clang -fno-elide-constructors
。
关于复制省略的更多信息
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 平凡类型与非平凡类型的复制消除差异
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 从指针进行特征3类型的强制转换/复制(溢出uint8_t)
- 我想复制 (wchar_t *) 缓冲区中的数据,但我无法这样做 bcz 还有其他不兼容的类型,类型转换但没有得到结果
- 通过用户定义的转换复制类类型的初始化
- 复制构造函数是如何在从类类型到类类型的类型转换过程中引发的
- 具有类型转换的多态复制构造函数
- 使用复制构造函数进行隐式类类型转换