我有两个具有相同名称和多个签名的函数,如下所示:
#include <iostream>
#include <string>
using namespace std;
//Function for bool data
void test(const bool &b) {
wcout << L"bool data is : " << b << endl;
};
//Function for wstring data
void test(const wstring &w) {
wcout << L"wstring data is : " << w.c_str() << endl;
};
void main() {
test(L"my string data for test");
test(true);
}
为什么当我使用wstring值类型void test(const bool &b)
函数执行时?
答案 0 :(得分:4)
宽字符串文字的类型为const wchar_t [N+1]
。当您将其传递给test
时,有两种可能的路径:
const wchar_t[N+1]
- &gt; const wchar_t*
- &gt; bool
const wchar_t[N+1]
- &gt; const wchar_t*
- &gt; std::wstring
选择第一个版本是因为重载分辨率更喜欢标准布尔转换为bool
优先于用户定义的转换为std::wstring
。
一种可能的解决方案是明确创建std::wstring
,Martin suggests,但我认为这可能会在以后再次引起你的反响。我会改为使用两个不同名称的函数来避免这个问题,或者添加一个带const wchar_t*
并转发到std::wstring
版本的重载。
void test(const wchar_t* w) {
test(std::wstring{w});
}
答案 1 :(得分:3)
您的字符串文字不是wstring
,而是const wchar_t[]
,它更容易转换为bool
(通过衰减为const wchar_t*
)而不是wstring
}。
在Visual Studios中运行代码给了我这个错误:
warning C4800: 'const wchar_t *' : forcing value to bool 'true' or 'false' (performance warning)
这提供了非常完美的解释。
答案 2 :(得分:3)
所有答案都给出了,如果你使用c ++ 14,你可以调整你在第一种情况下传递的文字。
#include <iostream>
#include <string>
using namespace std;
//Function for bool data
void test(const bool b) {
wcout << L"bool data is : " << b << endl;
};
//Function for wstring data
void test(const wstring &w) {
wcout << L"wstring data is : " << w.c_str() << endl;
};
int main() {
test(L"my string data for test"s);
test(true);
return 0;
}
wstring数据是:我的测试字符串数据
bool数据是:1
答案 3 :(得分:1)
你被隐式类型转换的规则所困扰。问题是L"my string data for test"
既不是bool
也不是std::wstring
。它实际上是wchar_t
的常量数组。
它可以通过数组衰减转换为bool
指针,然后指向bool
转换(如果指针为空则测试 - 它不是&#39; t)。
可以通过调用相应的构造函数将其转换为std::wstring
。
你的问题是标准要求编译器选择&#34;错误&#34;之一。
可能你最好的选择是写一个合适的额外过载。例如:
void test(const wchar_t* p)
{
test(std::wstring(p));
}