同名功能中的错误检测
Wrong detection in the same name functions
我有两个相同名称和多重签名的函数,如下所示:
#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
时,有两种可能的路径:
const wchar_t[N+1]
->const wchar_t*
->bool
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));
}
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 如何从标准输入中检测格式化输入错误?
- 程序停止运行,但未检测到错误
- JNI 在应用程序中检测到错误:在为 innerclass 调用 NewObject 时使用了无效的 jobject
- 在C++中检测到堆损坏错误
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- Clang 无法检测到初始化并给出错误
- 如何检测内存分配/空闲错误的对象?
- 想要构建一些必要的库来检测功能.出现一些错误
- Android (ART) 崩溃并显示错误 JNI 在应用程序中检测到错误:jstring 是无效的本地引用
- 保护类内存阵列以检测分段错误
- 舍入错误检测
- 从emxArray_uint8_T检测到错误:.text+0xc1):未定义对"emxInit_uint8_T1(emxArray_uint8_T**, int)"的引用?
- 排序程序的错误(检测到堆损坏)
- LLVM 的位码错误检测函数参数
- 类对象的可变级别内存错误检测
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- 错误检测Visual Studio 2010
- 同名功能中的错误检测
- GetModuleFileName防病毒错误检测??获取当前进程PATH