Mam klasę C
, która ma dowolną operację castingu. W tym przykładzie spróbowałem rzucić jego instancję na std::string
na trzy różne sposoby: static_cast
, konstruktor i przypisanie do std::string
. Jednak tylko ostatni kompiluje, podczas gdy inni podnoszą błąd niejednoznacznego konstruktora.Różne zachowania między jawną rzutowaniem, bezpośrednią inicjalizacją i inicjalizacją kopiowania
Powód błędu jest wystarczająco jasny: istnieje wiele sposobów konwersji C
na coś, co może zaakceptować konstruktor std::string
. Ale jaka jest różnica między tymi przypadkami? Dlaczego operator cast działa tak, jak powinien, ale nie?
struct C {
template<typename T>
operator T() const {
return T{};
}
};
int main() {
C c;
cout << static_cast<string>(c) << endl; // compile error
string bad(c); // compile error
string ok = c; // compiles successfully
}
UPD: jak bolov mowa w komentarzach, ten problem nie odtwarza z C++ 17. Przetestowałem go za pomocą g ++ - 5 i clang-3.8 z opcjami -std = C++ 11 i -std = C++ 14, i pokazuje on opisane błędy.
nie można odtworzyć: https://godbolt.org/g/ESR8cw – bolov
dziwo @bolov, ale nie powielać w C++ 17. Powtarza się przy godbolt z opcją -std = C++ 11. Dodam go do postu, dzięki. –
hmm .. ciekawe – bolov