簡體   English   中英

對重載函數 find_first_not_of 的不明確調用

[英]ambiguous call to overloaded function find_first_not_of

錯誤 C2668:“std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator&lt:wchar_t>>::find_first_not_of”:對重載函數的調用不明確

我在 Visual Studio 2013 中收到此錯誤,但在 MinGW 中沒有。 我能用這個做什么?

我嘗試添加cache.std::wstring::find_first_not_of ,但這沒有幫助。

我的代碼:

wstring cache = key.GetExpandStringValue(L"Path");
int empregnul = 0;
if(cache.find_first_not_of('\0') == wstring::npos)
{
    empregnul = 1;
}

我認為 MSVC 拒絕您的代碼不符合標准,至少從 C++14 開始。 您使用的版本早於 C++14,因此顯然不支持它,但更高的 MSVC 版本仍然會產生相同的歧義錯誤,即使使用/std:c++14/std:c++latest/permissive-標志,請參閱 hhttps://godbolt.org/z/fQA4YD。 但還要注意本答案末尾關於 MSVC 更新版本的評論。

MSVC 似乎認為'\\0'可以轉換為空指針值,因為它是空指針常量

這將使find_first_not_ofwchar_t作為參數的重載和以const wchar_t*作為參數的重載同樣匹配。

通過將字符值更改為除零以外的任何值,您可以看到這是 MSVC 對歧義的推理,例如'a' ,在這種情況下,MSVC 認為調用是明確的。

但是,在將CWG 問題 903作為缺陷報告解決后,C++14 標准(最終草案)和更高標准的[conv.ptr]/1中的相關段落說:

空指針常量是具有零值的整數文字 ([lex.icon]) 或類型為 std::nullptr_t 的純右值。

'\\0'字符文字,而不是整數文字 因此,它不是空指針常量,不能轉換為指針,從而使調用明確無誤。

在 CWG 問題 903 解決之前,任何整數類型和零值的右值常量表達式都是空指針常量,因此在這種情況下,MSVC 給出了歧義是正確的。 但這並不能解釋較新版本和 C++14(或更高版本)標志中的行為。

這可以通過使用L'\\0'而不是'\\0' ,因為L'\\0'具有wchar_t類型,因此它完全匹配期望wchar_t的重載,而期望const wchar_t*的重載需要轉換(假設甚至允許轉換),使前者更好地匹配並解決歧義。

上面提到的修復也是您無論如何都應該做的,即使沒有錯誤(盡管在這種特定情況下無關緊要)。 您不想將charwchar_t混合。 使用wchar_t / wstring始終在字符文字和字符串文字前面添加L以賦予它們正確的類型。


正如@RaymondChen 在此問題下的評論中指出的那樣,當給出/permissive-標志時,MSVC 的更新版本(在 Godbolt 上不可用)確實實現了 CWG 903 的分辨率,請參閱整數常量表達式的隱式轉換為空指針

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM