【发布时间】:2020-11-26 08:19:56
【问题描述】:
根据这段代码:
#include <iostream>
using namespace std;
struct T {
T() { cout << "default"<<endl; }
T(string s) { cout << "ctor "<< endl; }
T(const T& t) { cout << "copy ctor"<< endl; }
};
int main()
{
T x = T(T(T()));
return 0;
}
输出:
default
并根据standard:
(17) 初始化器的语义如下。目的地 type 是正在初始化的对象或引用的类型,并且 source type 是初始化表达式的类型。如果 初始值设定项不是单个(可能是带括号的)表达式, 源类型未定义。
.....
(17.6.1) 如果初始化表达式是纯右值并且 源类型的 cv 非限定版本与 目标的类,初始化表达式用于 初始化目标对象。 [例子:T x = T(T(T()));来电 T 默认构造函数来初始化 x。 —结束示例]
它在 c ++ 11 (GNU GCC v7.1.1) 中给出相同的结果
第一个问题: 此语句中是否定义了源类型?
T x = T(T(T()));
现在如果我们将这个函数添加到这段代码中:
string f(T t) {return "str";}
并将T x = T(T(f(T()))); 替换为T x = T(T(T()));
输出:
default
ctor
现在是否定义了源类型?
T() 不是初始化表达式吗?
如果是按照标准应该调用默认构造函数,但是为什么要为x调用T(string s)呢?
【问题讨论】:
标签: c++ c++11 language-lawyer