停止函数隐式转换

发布于 10-10 14:21 字数 692 浏览 7 评论 0原文

今天我遇到了一个奇怪的情况,我需要一个函数来不隐式转换值。

经过一番谷歌搜索后,我发现了这个 http://www.devx.com/cplus/10MinuteSolution/37078/1954< /a>

但我认为对我想要阻止的所有其他类型使用函数重载有点愚蠢,所以我这样做了。


void function(int& ints_only_please){}

int main() { 字符a=0; 整数b=0; 函数(a); 函数(b); }

我向朋友展示了代码,他建议我在 int 之前添加 const ,这样变量就不可编辑,但是当我开始编译时,编译得很好,但不应该,请看下面,看看我的意思


void function(const int& ints_only_please){}

int main() { 字符a=0; 整数b=0; 函数(a); //编译器应该停在这里,但 const int 却不会 函数(b); }

有谁知道这是为什么?

I came across a strange situation today where I needed a function to not implicitly convert values.

After some looking on google I found this http://www.devx.com/cplus/10MinuteSolution/37078/1954

But I thought it was a bit stupid to use a function overload for every other type I want to block so instead I did this.


void function(int& ints_only_please){}

int main() { char a=0; int b=0; function(a); function(b); }

I showed the code to a friend and he suggested I added const before int so the variable isn't editable, however when I did started compiling fine but it shouldn't, look below to see what I mean


void function(const int& ints_only_please){}

int main() { char a=0; int b=0; function(a); //Compiler should stop here but it doesn't with const int function(b); }

Does anyone know why this is?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

愁杀2024-10-17 14:21:53

使用模板来获得所需的效果:

template <class T>
void foo(const T& t);

template <>
void foo<int>(const int& t)
{

}

int main(){
  foo(9); // will compile
  foo(9.0); // will not compile
  return 0;
}

请注意,我们只为 int 编写了特殊版本的模板,因此使用任何其他类型作为模板参数的调用都会导致编译错误。

Use templates to get the desired effect:

template <class T>
void foo(const T& t);

template <>
void foo<int>(const int& t)
{

}

int main(){
  foo(9); // will compile
  foo(9.0); // will not compile
  return 0;
}

Note that we only write a special version of the template for int so that a call that has any other type as a template parameter will result in a compile error.

筱武穆2024-10-17 14:21:53

将临时变量绑定到 const 引用是合法的,但非 const 引用则不然。

char 可以隐式转换为 int,并且作为此转换结果的临时值可以绑定到 const int& 函数参数延长临时变量的生命周期,直到函数退出。

It is legal to bind a temporary to a const reference, but not a non-const reference.

A char can be implicitly converted to an int and the temporary that is the result of this conversion can be bound to a const int& function parameter extending the temporary's lifetime until the function exits.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文