【发布时间】:2014-03-02 04:48:22
【问题描述】:
在某些情况下,可能不需要隐式类型转换。
例如:
#include <string>
using namespace std;
void f(bool)
{}
void f(string)
{}
int main()
{
auto p = "hello";
f(p); // Oops!!! Call void f(bool); rather than void f(string);
}
如果C++标准支持关键字explicit可以用来限定函数参数,代码可以修改如下:
#include <string>
using namespace std;
void f(explicit bool) // Illegal in current C++11 standard!
{}
void f(string)
{}
int main()
{
auto p = "hello";
f(p); // Call void f(string);
bool b = true;
f(b); // Call void f(bool);
f(8); // Error!
}
为什么 C++ 标准不支持这么方便的功能?
【问题讨论】:
-
我不关注。
const char*比std::string更适合bool。前者是一个微不足道的结构,后者不是。所以你要解决的问题是..? -
这种情况下,我不想将
const char*隐式转换为bool,怎么办?换句话说,如果我愿意,如何在传递参数时禁用隐式类型转换? -
所以您不希望隐式转换为布尔值,但您确实希望它隐式转换为
std::string?这就是症结所在? -
@xmllmx 如果人们经常遇到这个问题,并且现有的解决方法不够令人满意,那么它可能有合理的机会被投票加入标准。但我认为情况并非如此,“优雅”并不是为标准已经超过 1300 页的语言添加更多功能的好理由。
-
IMO,想要这是一个很好的迹象,表明您正在不恰当地使用函数重载。
f做了什么,让它以bool或string作为其参数,并以任一方式执行逻辑等效处理是有意义的?
标签: c++ c++11 type-conversion standards overloading