【问题标题】:C++ implicit type conversion in Visual Studio 2010Visual Studio 2010 中的 C++ 隐式类型转换
【发布时间】:2011-07-04 03:48:21
【问题描述】:

我有一个函数:void foo(bool boolParam = true)

我把它改成了:void foo(const char* charParam, bool boolParam = true)

为了避免搜索,我只是编译了代码,希望编译器会在由于错误的参数类型而调用函数的地方给出错误(或至少是警告),但编译器却默默地将 false 转换为 NULL并在没有错误或警告的情况下编译所有内容。这种行为正确吗?我知道 false 和 NULL 都是 0,但我认为编译器至少应该给出一些警告信息...

【问题讨论】:

  • 嗯,它可能应该给你一些警告,但我想这是因为NULLwindows.h 中只是#defined 为0。不过,这是个好问题。
  • 如果您将警告级别设置为 4(在项目设置中),您应该会收到一些警告。
  • @Volker:你确定 /W4 会对此产生警告吗?
  • Mac OS 上的 GCC 4.2 中的行为相同
  • @Cody Gray,我刚刚用 /W4 进行了测试,它没有产生任何警告

标签: c++ visual-studio visual-studio-2010 visual-c++


【解决方案1】:

您可以保留原始功能未实现:

void foo(bool boolParam = true);
void foo(const char* charParam, bool boolParam = true)
{
  // do stuff
}

现在无论何时调用foo()foo(true)foo(false) 都会导致编译错误。但是,foo(NULL) 也不会编译,因为 NULL 和 false 是模棱两可的(然后我们回到第一方......)。

【讨论】:

  • @templatetypedef 我确实用 VS 对此进行了测试。我想这是因为foo(true)foo(false) 比第二个函数更好地满足第一个函数,并且因为第一个函数未实现,它会导致编译器错误。这是我有根据的猜测。
  • @Marlon- 啊,我错过了第一个函数没有实现。这很聪明!在发表评论之前,我应该更仔细地阅读内容。 XD
【解决方案2】:

这种行为是完全正确的,因为(正如您所注意到的)从 false(一个有效的空指针常量)到指针的转换是隐式的。请改用std::string

【讨论】:

  • 我不认为从 bool 到指针的转换是隐式的。当我从 false 更改为 true 时,出现以下错误:错误 C2664:“foo”:无法将参数 1 从“bool”转换为“const char *”。之前是正确的,只是因为 false 是 0 作为 NULL。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多