为什么不对转换构造函数进行隐式强制转换?
Why Doesn't This Do an Implicit Cast to the Converting Constructor?
所以我有这个代码:
struct Foo {
Foo() { cout << "defaultn"; }
Foo(const long long) { cout << "implicitn"; }
};
struct Bar {
Bar(const short param) : param(param) {}
operator long long() const { return static_cast<long long>(param); }
const short param;
};
我本以为Foo foo = Bar(13)
会使用我的隐式强制转换,然后使用转换构造函数。但它错误:
错误:请求从
Bar
转换为非标量类型Foo
不过这工作正常:Foo foo(Bar(13))
.为什么我的隐式转换用于显式转换构造,而不用于隐式转换构造?
我从 https://en.cppreference.com/w/cpp/language/copy_initialization 那里得到的规则是:
转换的结果(如果使用转换构造函数,则为 prvalue 表达式(随后用于直接初始化对象
首先,从Bar
到long long
的隐式转换,以及从long long
到Foo
的隐式转换都是用户定义的转换。
Foo foo = Bar(13);
执行副本初始化,编译器将尝试将Bar
转换为隐式Foo
。需要两个隐式转换,即将Bar
转换为long long
然后将long long
转换为Foo
。但在一个隐式转换序列中只允许一个用户定义的转换。
隐式转换序列按以下顺序由以下内容组成:
1(零个或一个标准转换序列;
2(零个或一个用户定义的转换;
3(零个或一个标准转换序列。
用户定义的转换由零个或一个非显式单参数构造函数或非显式转换函数调用组成
Foo foo(Bar(13));
执行直接初始化。将检查Foo
的构造函数,并通过重载解析选择最佳匹配。只需要一个隐式用户定义的转换(从Bar
到long long
(;之后,Foo::Foo(long long)
被调用直接构造foo
。
当您使用副本初始化时,根据文档
此外,复制初始化中的隐式转换必须直接从初始值设定项生成 T,而直接初始化需要从初始值设定项到 T 构造函数参数的隐式转换。
重点是我的。事实并非如此。
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- enable_if转换构造函数(静态强制转换,is_base_of)
- 为什么我需要在转换构造函数上引用 this->?
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 为什么不对转换构造函数进行隐式强制转换?
- 转换构造函数和运算符都存在且涉及显式性时的行为
- C++ 03 类模板 这是转换构造函数还是转换运算符?以及如何声明解决此问题的方法
- 使用完美转发的模板转换构造函数
- 转换构造函数的参数可以隐式转换吗?
- std::变量转换构造函数行为
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 为什么不调用模板类中的转换构造函数?
- 转换构造函数的隐式参数
- 转换构造函数:您如何解释C 中给定不同参数的函数
- C++变体:为什么转换构造函数需要大小.(类型)为非零
- C++变体用bool转换构造函数
- 在重载解析期间调用转换运算符,而不是在 c++17 中转换构造函数
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 如何将转换构造函数与指针一起使用?
- 为什么在调用隐式类型转换构造函数之后直接是驱动器