使用转换函数直接初始化
Direct initialization with conversion functions
这个问题几乎与直接初始化中的转换运算符相同,但是,这是我在实现中注意到的。
请考虑以下事项:
struct A { A(); A(A&&); };
struct B { operator A(); };
void f()
{
B b;
A a(b);
}
我对标准的解读是,由于这种直接初始化(源和目标类型不同(仅考虑构造函数。选择构造函数 A(A&&(,并将参数绑定到转换函数的结果,总共产生两个调用:operator A()
、A(A&&)
,因为 [dcl.init]/17.6.2.1 是唯一适用于此处的子句。
但是,这不是 gcc、msvc 和 clang 或 icc 显示的行为,它们都说只调用operator A()
。我是否正确地假设这只是编译器优化?
我认为没有理由不在这里单独使用转换构造函数,除了我找不到任何描述此行为的措辞。
基本上,上述所有编译器都在继续并实现 CWG 第 2327 期中的方向。您是正确的,目前没有措辞允许您观察到的行为。但正如问题所指出的那样,如果有的话,那就太好了。
然而,确切的答案是很棘手的,所以这个问题仍处于"起草"阶段。但是编译器可以并且确实实现了复制省略。
相关文章:
- 正在初始化函数指针的constexpr数组
- 我应该在C++中使用构造函数还是初始化函数
- 使用 extern const 初始化函数
- 初始化函数中的静态变量,而不是在文件开始时
- 如何初始化函数中指针数组的大小
- 正在初始化初始化函数中的静态类成员
- call_once初始化函数
- SWIG + CMAKE:缺少初始化函数
- 如何创建在 c++ 中只读取一次的初始化函数
- 类内的强制初始化函数
- 使用元编程在编译时初始化函数数组
- 数组初始化函数:将数组作为指针传递:C++
- 从nodejs模块初始化函数报告失败
- 导入错误:动态模块未定义初始化函数
- 大括号初始化函数指针数组:从 'void (*(*)())()' 到 'void (*)()' 的转换无效
- 奇怪的行为,用 int 初始化函数指针
- 使用 init_seg 调用初始化函数
- 正在初始化函数内部的std::数组
- 初始化函数内部的指针.它是如何工作的
- JNI初始化函数以及缓存类和字段