W poniższym przykładzie, mój wynik jest „pojedynczy konstruktor param”, dwa razy. Moje pytanie jest dwojaka, po pierwsze, dlaczego jest konstruktor bool nazywane zamiast wersji zawierającej ciąg znaków, a po drugie, czy istnieje sposób, aby uzyskać wersji ciąg o nazwie bez rzucania rozmowę?wyraźny konstruktor niewłaściwego typu nazywane
Tak na marginesie, mój rzeczywisty kod nie nazwać konstruktorów z zakodowane ciągi ale z czymś takim:
static constexpr auto NONE = "NONE";
Foo aFoo(NONE);
...
#include <iostream>
#include <string>
using namespace std;
struct Foo {
explicit Foo(bool _isVisible = false): id(""), isVisible(_isVisible) {cout << "single param ctor" << endl;}
explicit Foo(const string _id, bool _isVisible = false): id(_id), isVisible(_isVisible) {cout << "multip param ctor" << endl;}
const string id;
bool isVisible;
};
int main(int argc, const char * argv[]) {
shared_ptr<Foo> sharedFoo = make_shared<Foo>("hello");
Foo regFoo("hi");
return 0;
}
Gdyby nie to krzywo nonsens niejawna * string-dosłowny * do * konwersja bool * o wyższym priorytecie jest przestarzała w C++? – WhiZTiM
@WhiZTiM: 'nullptr' został wprowadzony, aby pomóc w pewnych okolicznościach, ale jeśli nie zmienimy typu literałów łańcuchowych lub nie usuniemy rozpadu z tablicą-nazwą, ani nie zmienimy sposobu działania wskaźników, utknęliśmy na tym. Wprowadzono więc "" foo ", aby dać nam ciągi literałów, które nie ulegają problemowi, ale jest to przydatne tylko wtedy, gdy jesteś już świadomy problemu! A jeśli tak, to i tak stosunkowo łatwo jest rozwiązać u źródła (jak pokazano powyżej). –
@WhiZTiM: BTW słowo, którego szukasz, jest "przestarzałe". –