【发布时间】:2016-04-28 09:38:11
【问题描述】:
我在C++标准草案N4582中看到了如下的文字:
[over.best.ics/4] 但是,如果目标是
(4.1) 构造函数的第一个参数或
(4.2) 自定义转换函数的隐式对象参数
而构造函数或用户定义的转换函数是候选者
(4.3) 13.3.1.3,当参数是类复制初始化第二步中的临时参数时,或
(4.4) 13.3.1.4、13.3.1.5 或 13.3.1.6(在所有情况下),
不考虑用户定义的转换序列。
我对粗体部分感到困惑,不知道如何理解它。我编写了以下程序:
#include <iostream>
using namespace std;
struct A {
A(int) {}
operator int() {cout << "user-defined conversion" << endl; return 0;}
A(A&) {} //prevent default copy
};
int main()
{
A a = A(0);
}
在g++ 5.3.0下运行良好,输出“user-defined conversion”,表示发生了用户定义的转换。当然,也可以理解为临时的A(0)不是copy-initialization的结果。接下来我将程序更改为:
#include <iostream>
using namespace std;
struct A {
A(int) {}
operator int() {cout << "user-defined conversion" << endl; return 0;}
A(A&) {} //prevent default copy
};
A foo() {return A(0);}
int main()
{
A a = foo();
}
现在 foo() 的值是从 A(0) 初始化的临时副本,但程序仍然有效。为什么会这样?
【问题讨论】:
-
您的报价不正确;您省略了 4.2 并将 4.3 重新编号为 4.2。
-
你明白“第二步”指的是什么吗?
-
@ecatmur 抱歉引用不正确。
-
@T.C.不,我不太明白“第二步”的含义。
标签: c++ standards implicit-conversion