[英]ambiguous call to overloaded function find_first_not_of
錯誤 C2668:“std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<: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_of
以wchar_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*
的重載需要轉換(假設甚至允許轉換),使前者更好地匹配並解決歧義。
上面提到的修復也是您無論如何都應該做的,即使沒有錯誤(盡管在這種特定情況下無關緊要)。 您不想將char
與wchar_t
混合。 使用wchar_t
/ wstring
始終在字符文字和字符串文字前面添加L
以賦予它們正確的類型。
正如@RaymondChen 在此問題下的評論中指出的那樣,當給出/permissive-
標志時,MSVC 的更新版本(在 Godbolt 上不可用)確實實現了 CWG 903 的分辨率,請參閱整數常量表達式的隱式轉換為空指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.