Po niedawnym wprowadzeniu przeciążenia metody aplikacja zaczęła zawieść. W końcu go śledząc, nowa metoda jest wywoływana tam, gdzie nie oczekiwałam.Dlaczego kompilator wybiera bool over string dla niejawnej typecast L ""?
Mieliśmy
setValue(const std::wstring& name, const std::wstring& value);
std::wstring avalue(func());
setValue(L"string", avalue);
std::wstring bvalue(func2() ? L"true", L"false");
setValue(L"bool", bvalue);
setValue(L"empty", L"");
został zmieniony tak, że gdy wartość bool jest przechowywany używamy tych samych ciągów (przechowywania danych wewnętrznych ciągów)
setValue(const std::wstring& name, const std::wstring& value);
setValue(const std::wstring& name, const bool& value);
std::wstring avalue(func());
setValue(L"string", avalue);
setValue(L"bool", func2());
setValue(L"empty", L""); << --- this FAILS!?!
Problem z L „” jest że jest to domyślnie rzucanie, a wcześniej było szczęśliwe bycie std :: wstringiem, ale nie woli być boolem. Kompilator MSVC nie narzeka, ani nie ostrzega, więc obawiam się, że nawet jeśli "naprawię" wartość setValue (L "empty", L ""); być
setValue(L"empty", std::wstring());
ktoś inny może przyjść później i po prostu użyć setValue (L "pusty", L ""); i ponownie musimy wyśledzić ten problem.
Pomyśleliśmy użyć jawnie w tej metodzie, ale nie jest to poprawne słowo kluczowe dla tego użycia. Czy istnieje sposób, aby kompilator mógł złożyć skargę na ten temat lub w inny sposób zapobiec problemowi? W przeciwnym razie zastanawiam się, czy zmienić nazwę metody, która ma wartość bool, aby upewnić się, że nie może ona złożyć błędnego wyniku.
Dodałem do mojej listy powodów, dla których C++ nie jest najlepszym językiem. – Qix