【问题标题】:Direct initialization with conversion functions使用转换函数直接初始化
【发布时间】:2020-01-26 08:00:17
【问题描述】:

这个问题与Conversion operator in direct-initialization 几乎相同,但是,这是我在实现中注意到的一些问题。

考虑以下几点:

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()。我认为这只是编译器优化是否正确?

我认为没有理由不在这里单独使用转换构造函数,除了我找不到任何描述这种行为的措辞。

【问题讨论】:

  • 你说得对,如果重载决议选择了移动构造函数,我没有意识到这里需要实现一个临时的。对不起,我的错,删除了我的答案。我相信 StoryTeller 是对的。

标签: c++ initialization language-lawyer


【解决方案1】:

基本上所有前面提到的编译器都在前进并实现CWG Issue 2327 中的方向。您是正确的,目前没有允许您观察到的行为的措辞。但正如问题所指出的那样,如果有的话,那就太好了。

但是,要确定它的确切内容是很棘手的,因此该问题仍处于“起草”阶段。但是编译器可以并且确实实现了复制省略..

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2010-10-13
相关资源
最近更新 更多