Plu*_*luc 4 c++ struct implicit-conversion c++11
我需要声明大量简单的 POD 结构,它们的行为相同,但实际上是不同的类型,即不是 typedef。
无论如何,我只是想让它们尽可能简单。但是在测试时我看到编译器执行一些隐式转换,我想避免这种情况。
鉴于此代码:
template<typename T>
struct Struct {
T data;
operator T() const { return data; }
};
void fun(Struct<float> value)
{
cout << "Call with Struct :: " << value << endl;
}
void fun(int value)
{
cout << "Call with INT :: " << value << endl;
}
int main(int, char**)
{
fun(3);
fun(4.1f);
fun(Struct<float>{5.2});
fun(Struct<double>{6.3});
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用 GCC 编译。
执行给了我:
Call with INT :: 3 // Ok
Call with INT :: 4 // [1]
Call with Struct :: 5.2 // Ok
Call with INT :: 6 // [2]
Run Code Online (Sandbox Code Playgroud)
如何避免隐式转换 [1] 和 [2] ?
谢谢
按照评论中的要求:
使用显式关键字 foroperator T()实际上会阻止隐式类型转换。
因此,以这种方式声明结构:
template<typename T>
struct Struct {
T data;
explicit operator T() const { return data; }
};
Run Code Online (Sandbox Code Playgroud)
将使编译器阻止隐式转换,并要求客户端代码专门要求转换(即在T(Struct<T>)需要 T 的任何地方使用)
| 归档时间: |
|
| 查看次数: |
4591 次 |
| 最近记录: |