C++ 为什么'S x({})`调用GCC 7/C+中的默认构造函数+;仅1z模式?
在下面的代码段中,使用C++1z模式的GCC 7调用默认构造函数,但GCC/C++14和Clang/C++14、C++1z调用初始值设定项列表构造函数 这种行为是否受到任何C++1z规范更改(可能?)或GCC错误的影响C++ 为什么'S x({})`调用GCC 7/C+中的默认构造函数+;仅1z模式?,c++,gcc,language-lawyer,c++17,C++,Gcc,Language Lawyer,C++17,在下面的代码段中,使用C++1z模式的GCC 7调用默认构造函数,但GCC/C++14和Clang/C++14、C++1z调用初始值设定项列表构造函数 这种行为是否受到任何C++1z规范更改(可能?)或GCC错误的影响 #include <cstdio> #include <initializer_list> struct S { S() { std::printf("DEF "); } // (1) S(std::initializer_list&l
#include <cstdio>
#include <initializer_list>
struct S {
S() { std::printf("DEF "); } // (1)
S(std::initializer_list<int> il) // (2)
{ std::printf("L=%zu ", il.size()); }
};
int main() {
S x({});
}
#包括
#包括
结构{
S(){std::printf(“DEF”);}//(1)
S(标准::初始值设定项列表il)/(2)
{std::printf(“L=%zu”,il.size());}
};
int main(){
sx({});
}
输出:
- :
L=0
- :
DEF
- :
L=0
- 如果初始值设定项表达式是prvalue,并且源类型的cv非限定版本与目标的类是同一个类,则初始值设定项表达式用于初始化目标对象
{}
,它甚至不是一个表达式,因此它甚至没有cv非限定类型来与S
进行比较。如果我们写的是sx(S{})
,这个项目符号就适用了
- 否则,如果初始化是直接初始化,或者是复制初始化,其中源类型的cv非限定版本与目标类相同,或者是目标类的派生类,则会考虑构造函数。将枚举适用的构造函数([over.match.ctor]),并通过重载解析选择最佳构造函数。调用如此选择的构造函数来初始化对象,并将初始值设定项表达式或表达式列表作为其参数。如果没有应用构造函数,或者重载解析不明确,则初始化是错误的
std::initializer\u list
构造函数,该构造函数根据[over.ics.rank]获得优先级,因此选择了一个
这里C++14和C++17之间唯一的区别是引入了第一个项目符号-它无论如何都不适用,因此行为应该是相同的。堆栈溢出,在堆栈溢出中,编译器错误是从异常问题中发现的。@InternetUssie问题是不是每个人都提交了一个错误report@ShafikYaghmour的确但至少像巴里这样的一些人很友善,主动将这些问题提交给那些能够解决它们的人!谢谢你。