Visual Studio 2013 'explicit'关键字错误?
Visual Studio 2013 'explicit' keyword bug?
考虑以下程序:
#include <iostream>
class A
{
public:
A( ) { std::cout << "A()n"; }
A( A& ) = delete;
A( int i ) { std::cout << "A( " << i << " )n"; }
explicit operator int( ) { std::cout << "operator int()n"; return 42; }
};
template< typename T = A > void f( T a = A() ) {}
int main( void )
{
f();
return 0;
}
Visual Studio 2013编译此代码并运行,输出
A()
operator int()
A( 42 )
这是编译器错误吗?在这个上下文中,VS编译器似乎没有注意到"explicit"关键字。据我所知,VS 2013错误地将运算符int()与A(int)组合使用,将"复制构造"A作为f的默认参数。
均添加
A a;
A a1( a );
到main并声明f为
void f( A a = A() ) {}
不编译,VS抱怨A(A&)被删除,这似乎是正确的行为。只有在函数模板默认参数的上下文中,运算符int()和A(int)的组合似乎可以替代A(A&)。
g++4.7.3没有编译代码并抱怨:
main.cpp: In function ‘int main()’:
main.cpp:21:7: error: no matching function for call to ‘A::A(A)’
main.cpp:21:7: note: candidates are:
main.cpp:10:3: note: A::A(int)
main.cpp:10:3: note: no known conversion for argument 1 from ‘A’ to ‘int’
main.cpp:6:3: note: A::A()
main.cpp:6:3: note: candidate expects 0 arguments, 1 provided
删除"explicit"将使g++编译代码,并且输出相同。
这绝对是Visual C++中的一个bug。根据标准:
12.3.2转换功能[class.conv.fct]
2-转换函数可以是显式的(7.1.2),在这种情况下仅被视为直接初始化的用户定义转换(8.5)在某些情况下(13.3.1.4、13.3.1.5、13.3.1.6)。
并且在您的示例中没有直接初始化。
其他C++编译器,如GCC和Clang,在这种情况下会报告一个错误。
在VS论坛中长大:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/af733e56-8045-4553-a9af-6555d02fc2f6/bug-in-vs-2013-support-for-explicit-conversion-operators?forum=visualstudiogeneral
并将其报告为错误:
http://connect.microsoft.com/VisualStudio/feedback/details/811334/bug-in-vs-2013-support-for-explicit-conversion-operators
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 如果我不使用"新"关键字,为什么会出现细分错误?
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 具有多个定义时,对于外部关键字没有错误
- STD ::对行为的对模板类型扣除?(否,显式关键字错误)
- 错误 RC2104:未定义的关键字或键名称:DS_SETFONT
- 使用boost::引用元组作为orderedunique索引的关键字时出现boost多索引插入错误
- 在 C++ 中使用关键字 "this" 时出现意外错误
- Visual Studio 2013 'explicit'关键字错误?
- 使用自动关键字创建的类型的表达式模板中存在分段错误
- 在结构构造函数中使用"this"关键字编译错误?-C++
- 使用"auto"关键字时"redefinition"错误更改为"differs in levels of indirection"
- 内联关键字导致可视化C++中链接器错误 2019
- "this"关键字导致分段错误
- 复数类中的静态关键字错误
- 显式关键字处的类声明错误
- 根据关键字拆分一行(有拼写错误)
- C++程序使用 C 库标头将"this"识别为关键字。外部"C"错误?
- 与关键字'private'相关的错误
- 即使typename关键字也会抛出Typedef错误