Явная ошибка ключевого слова Visual Studio 2013?
Рассмотрим следующую программу:
#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 не учитывает ключевое слово "явное" в этом контексте. По моему мнению, VS 2013 неправильно использует оператор int() в сочетании с A (int) для сортировки "copy-construct" 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
Удаление "явного" делает g++ компилировать код, а вывод одинаков.
Ответы
Ответ 1
Это, безусловно, ошибка в Visual С++. Согласно стандарту:
12.3.2. Функции преобразования [class.conv.fct]
2 - Функция преобразования может быть явной (7.1.2), и в этом случае она рассматривается только как пользовательское преобразование для прямой инициализации (8.5) в определенных контекстах (13.3.1.4, 13.3.1.5, 13.3.1.6).
и в вашем примере нет прямой инициализации.
Другие компиляторы С++, такие как GCC и Clang, сообщают об ошибке в этом случае.
Ответ 2
Воспитан на форуме 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