同名功能中的错误检测

Wrong detection in the same name functions

本文关键字:错误 检测 功能      更新时间:2023-10-16

我有两个相同名称和多重签名的函数,如下所示:

#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)函数?

宽字符串文字的类型为const wchar_t [N+1]。当您将其传递给test时,有两种可能的路径:

  1. const wchar_t[N+1]->const wchar_t*->bool
  2. const wchar_t[N+1]->const wchar_t*->std::wstring

之所以选择第一个版本,是因为重载解析更喜欢标准布尔值转换为bool,而不是用户定义的std::wstring转换。

一个可能的解决方案是显式地创建std::wstring,正如Martin所建议的那样,但我认为这可能会在以后再次困扰你。我会使用两个不同名称的函数来避免这个问题,或者添加一个重载,该重载使用const wchar_t*并转发到std::wstring版本。

void test(const wchar_t* w) {
    test(std::wstring{w});   
}

您的字符串文字不是wstring,而是const wchar_t[],它比wstring更容易转换为bool(通过衰减为const wchar_t*)。

在Visual Studio中运行代码时出现以下错误:
warning C4800: 'const wchar_t *' : forcing value to bool 'true' or 'false' (performance warning)
这给出了一个非常完美的解释。

所有给出的答案,如果使用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数据是:我的测试字符串数据
布尔数据为:1

您已经被隐式类型转换的规则所困扰。问题是L"my string data for test"既不是bool也不是std::wstring。它实际上是wchar_t的常量数组。

它可以通过数组衰减到指针,然后进行指针到bool的转换(测试指针是否为空-它不是)来转换为bool

可以通过调用适当的构造函数将其转换为std::wstring

您的问题是,标准要求编译器选择"错误"的。

也许你最好的办法是写一个合适的附加重载。例如:

void test(const wchar_t* p)
{
   test(std::wstring(p));
}