«Явная» ошибка ключевого слова в 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 );

к основному и объявив 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 ++ компилирует код, и результат такой же.

22

Решение

Это определенно ошибка в Visual C ++. Согласно стандарту:

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, сообщают об ошибке в этом случае.

6

Другие решения

По вопросам рекламы [email protected]