【问题标题】:C++ how do i keep compiler from making implicit conversions when calling functions?C ++如何在调用函数时防止编译器进行隐式转换?
【发布时间】:2013-11-29 10:29:34
【问题描述】:

这是交易:

当我有一个像这样的默认参数的函数时

int foo (int a, int*b, bool c = true);

如果我这样误称:

foo (1, false);

编译器会将 false 转换为 int 指针并调用 b 指向 0 的函数。

我看到有人建议使用模板方法来防止隐式类型转换:

template <class T>
int foo<int> (int a, T* b, bool c = true);

但是这种方法太乱了,让代码混乱。

有明确的关键字,但它只适用于构造函数。

我想要的是一种类似于显式方法的干净方法,这样当我像这样声明方法时:

(keyword that locks in the types of parameters) int foo (int a, int*b, bool c = true);

然后这样称呼它:

foo (1, false);

编译器会给我这个:

foo (1, false);
         ^
ERROR: Wrong type in function call (expected int* but got bool)

有这样的方法吗?

【问题讨论】:

  • 当您拥有void foo(short a, int b, long c) 并且您将其称为foo(1, 1, 1) 时,您希望它做什么? “哦,那些隐式转换没问题”
  • 实际上这些不是转换,因为整数是模棱两可的数据。我想在调用 foo (a (int), b (some other object) ) 时阻止大部分转换;这些错别字让我很头疼。
  • 您遇到的问题与隐式转换无关;这是关于文字的。在隐式转换的情况下,编译器已经给出了您期望的错误,例如bool x = false; foo(1, x);

标签: c++ casting default implicit explicit


【解决方案1】:

不,没有这样的方法。我认为模板很适合这种事情。但是,例如在 gcc 中有标志 -Wconversion-null,对于带有 foo(1, false) 的代码,它会给出警告

将 «false» 转换为 «int foo(int, int*, bool)» [-Wconversion-null]

在clang中有一个标志-Wbool-conversion

将“int *”类型的指针从常量初始化为空 布尔表达式 [-Wbool-conversion]

【讨论】:

  • 使用 gcc,您可以将其与 -Werror 或 -Werror= 配对,并获得警告作为错误!正是 OP 想要的!
  • 真可惜。我希望他们有一天会添加这个功能,这样我就可以停止使用 int foo (int a, int b) { foo (a, b, true); } =(
【解决方案2】:

最好的方法是正确设置警告级别,而不是忽略警告。

例如 gcc,有 -Wall 选项,它可以处理很多有问题的情况,并且会在你的情况下显示下一个警告(g++ 4.8.1):

garbage.cpp: In function ‘int main(int, char**)’:
garbage.cpp:13:13: warning: converting ‘false’ to pointer type for argument 2 of ‘int foo(int, int*, bool)’ [-Wconversion-null]
  foo(0,false);

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多