Мне пришлось потратить некоторое время на поиск и исправление ошибки, которую мне удалось выделить в следующем коде:
#include <iostream>
struct A
{
std::string S;
A(const std::string s) { S = s; }
};
void f1(A a) { std::cout << "f1:a.S = " << a.S << "\n"; }
void f1(const std::string s) { std::cout << "f1:s = " << s << "\n"; }
void f2(A a) { std::cout << "f2:a.S = " << a.S << "\n"; }
int main()
{
f1(A("test"));
f1(std::string("test"));
f2(A("test"));
f2(std::string("test"));
return 0;
}
Ошибка была вызвана пропущенной (мной и компилятором (?)) неоднозначностью, созданной f1
-функцией: f2
ясно показывает, что и f1(A)
, и f1(std::string)
применимы к A
, но при компиляции неоднозначность не улавливается компилятором. , и при выполнении вывод:
f1:a.S = test
f1:s = test
f2:a.S = test
f2:a.S = test
Правильно ли это поведение? Проблема с компилятором? Или просто старый добрый PIBCAK?
f1(std::string)
, ожидаяA
и не получая его :( - person slashmais   schedule 25.11.2012