当前位置: 首页 > 知识库问答 >
问题:

`auto x=type{...}`初始化语法和`explicit`转换运算符-clang vs gcc

慕健
2023-03-14

给定以下代码(在wandbox上):

struct X
{
    explicit operator int() { return 0; }
};

int main()
{
    auto y = int{X{}};
}

和下列编译器选项:

cppreference似乎建议auto var=type{...}语法应该触发显式转换。

共有1个答案

刘选
2023-03-14

使用http://open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf我认为G++是错误的。

8.6.4第3.7条规定:

-否则,如果初始化器列表有一个类型为E的元素,并且T不是引用类型或其引用类型与E相关,则从该元素初始化对象或引用(对于复制列表初始化,通过复制初始化,或者对于直接列表初始化,通过直接初始化);如果需要缩小转换(见下文)来将元素转换为T,则程序格式不正确。

-考虑了S及其基类的转换函数。那些不隐藏在S中并产生类型T或可以通过标准转换序列(13.3.3.1.1)转换为类型T的非显式转换函数是候选函数。对于直接初始化,那些不隐藏在S中并产生类型T或可以通过限定转换(4.5)转换为类型T的显式转换函数也是候选函数。对于选择候选函数的过程,返回CV限定类型的转换函数被认为产生了该类型的CV限定版本。返回“对cv2 X的引用”的转换函数根据引用的类型返回“cv2 X”类型的L值或xvalues,因此在选择候选函数的过程中被认为产生X。

 类似资料:
  • 按照对象的类型以及初始化时的上下文,C++提供了五花八门的对象初始化的方式。若不慎误用,可能会产生匪夷所思的谬误,而且还伴随着莫名其妙的错误(调试)信息。考虑如下的代码: string a[] = { “foo”, ” bar” }; //正确:初始化数组变量 //错误:初始化列表应用在了非聚合的向量上 vector<string> v = { “foo”, ” bar” }; void f(s

  • 算法岗 三道编程题,C了2/3希望能过。。 第一道经典找迷宫出口,bfs就行,注意边界。 第二道计算NxN矩阵的行列式,我用的dfs按照公式算,好像有问题。。没写出来。 第三道统计区间长度,先排序,合并重叠区间然后统计长度。 #AutoX#

  • 在试图创建一个。导入matplotlib后,我收到以下错误: 回溯(最近一次调用):文件“”,第1行,在文件“C:\Users\Flo\AppData\Local\Programs\Python\Python38\Lib\site packages\matplotlib__init__.py”中,第1015行,在rcParams=rc_params()文件“C:\Users\Flo\AppData

  • 如果没有找到可行的初始值设定项列表构造函数,则再次执行重载解析,其中候选函数是类T的所有构造函数,参数列表由初始值设定项列表的元素组成。 : 如果构造函数的第一个参数类型为或对某些类型可能是CV限定的的引用,并且没有其他参数,或者所有其他参数都具有默认参数,则构造函数就是初始化式列表构造函数

  • 下面的代码将泛型(POD)类型包装成(模板)类,并定义内部模板转换操作符,以便能够在兼容(但不同)类型之间进行隐式转换。我希望代码是相当自我解释的。在任何情况下,我都无法理解为什么将转换为另一个POD都能正常工作,但将(此处键入为)转换为)却失败得很 有什么想法吗?代码如下:

  • C++ 运算符 强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。 大多数的 C++ 编译器都支持大部分通用的强制转换运算符: (type) expression 其中,type 是转换后的数据类型。下面列出了 C++ 支持的其他几种强制转换运算符: const_cast<type> (expr): const