Следующий код хорошо компилируется в gcc 7.3.0, но не компилируется с clang 6.0.0.
#include <string>
struct X {
X() : x(10) {}
int operator[](std::string str) { return x + str[0]; }
template <typename T> operator T() { return x; } // (1) fails only in clang
//operator int() { return x; } // (2) fails both in gcc and clang
private:
int x;
};
int main() {
X x;
int y = 20;
int z = int(x);
return x["abc"];
}
Я использовал команду clang++ 1.cpp -std=c++98
с указанием разных стандартных версий. Я пробовал С++ 98,11,14,17,2a. Во всех случаях ошибка одинакова. Сообщение об ошибке в Clang выглядит следующим образом:
1.cpp:14:13: error: use of overloaded operator '[]' is ambiguous (with operand types 'X' and 'const char [4]')
return x["abc"];
~^~~~~~
1.cpp:5:9: note: candidate function
int operator[](std::string str) { return x + str[0]; }
^
1.cpp:14:13: note: built-in candidate operator[](long, const char *)
return x["abc"];
^
1.cpp:14:13: note: built-in candidate operator[](long, const volatile char *)
1 error generated.
Какой компилятор правильно следует стандарту в этой ситуации? Это действительный код?
Описание проблемы можно найти здесь, но это о ситуации (2). Я заинтересован в случае (1).