Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么'S x({})`调用GCC 7/C+中的默认构造函数+;仅1z模式?_C++_Gcc_Language Lawyer_C++17 - Fatal编程技术网

C++ 为什么'S x({})`调用GCC 7/C+中的默认构造函数+;仅1z模式?

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

在下面的代码段中,使用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<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
我认为这是一个gcc错误(作为提交)。C++17中[dcl.init]的规则顺序为:

如果目标类型是(可能是cv限定的)类类型:

  • 如果初始值设定项表达式是prvalue,并且源类型的cv非限定版本与目标的类是同一个类,则初始值设定项表达式用于初始化目标对象
第一个项目不适用。这里的初始值设定项表达式是
{}
,它甚至不是一个表达式,因此它甚至没有cv非限定类型来与
S
进行比较。如果我们写的是
sx(S{})
,这个项目符号就适用了

  • 否则,如果初始化是直接初始化,或者是复制初始化,其中源类型的cv非限定版本与目标类相同,或者是目标类的派生类,则会考虑构造函数。将枚举适用的构造函数([over.match.ctor]),并通过重载解析选择最佳构造函数。调用如此选择的构造函数来初始化对象,并将初始值设定项表达式或表达式列表作为其参数。如果没有应用构造函数,或者重载解析不明确,则初始化是错误的
这是直接初始化,因此构造函数按照[over.match.ctor]进行考虑,它只告诉is重载构造函数。由于有一个
std::initializer\u list
构造函数,该构造函数根据[over.ics.rank]获得优先级,因此选择了一个



这里C++14和C++17之间唯一的区别是引入了第一个项目符号-它无论如何都不适用,因此行为应该是相同的。

堆栈溢出,在堆栈溢出中,编译器错误是从异常问题中发现的。@InternetUssie问题是不是每个人都提交了一个错误report@ShafikYaghmour的确但至少像巴里这样的一些人很友善,主动将这些问题提交给那些能够解决它们的人!谢谢你。