在同名函数中检测错误

时间:2016-07-20 13:32:15

标签: c++

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

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

4 个答案:

答案 0 :(得分:4)

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

  1. const wchar_t[N+1] - &gt; const wchar_t* - &gt; bool
  2. const wchar_t[N+1] - &gt; const wchar_t* - &gt; std::wstring
  3. 选择第一个版本是因为重载分辨率更喜欢标准布尔转换为bool优先于用户定义的转换为std::wstring

    一种可能的解决方案是明确创建std::wstringMartin 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;
}

output

  

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));
}