Следующая программа на С++ компилируется без предупреждений во всех компиляторах, которые я пробовал (gcc 4.6.3, llvm 3.0, icc 13.1.1, SolarisStudio 12.1/12.3):
struct CClass
{
template<class T>
operator T() const { return 1; }
operator int() const { return 2; }
};
int main(void)
{
CClass x;
return static_cast<char>(x);
}
Однако все, кроме компиляторов SolarisStudio, возвращают 2, SolarisStudio (любая версия) возвращает 1, что я считаю самым логичным результатом.
Использование return x.operator char();
приводит ко всем компиляторам, возвращающим 1.
Очевидно, что, учитывая это, я использовал последнюю нотацию. Однако я хотел бы знать, какой из компиляторов правильный и почему. (Можно было бы подумать, что большинство правил, но это все еще не объясняет, почему.)
Этот вопрос, похоже, связан с вопросами SO здесь, здесь и здесь, но эти "только" дают решения проблем, никаких объяснений (я все равно мог применить к моей конкретной проблеме).
Обратите внимание, что добавление дополнительного перегруженного оператора литья, скажем, operator float() const { return 3; }
, приводит ко всем компиляторам, за исключением SolarisStudio, жалующихся на двусмысленность.