【问题标题】:g++ compiler and implicit conversiong++ 编译器和隐式转换
【发布时间】:2026-02-13 22:25:03
【问题描述】:

我正在使用 g++ 编译我的 C++ 程序,但我想停止 int 和 dooble 等类型之间的隐式转换,例如: 我有一个使用 double 作为参数的函数,但是当我在这个函数的参数中发送一个 int 时,编译通过而没有错误或警告。

这是我的问题,如何停止隐式转换??

谢谢。

【问题讨论】:

标签: c++ g++ type-conversion implicit-conversion


【解决方案1】:

你可以试试这个:

#include <iostream>

template<typename T>
void func(T t);

void func(double d)
{
    std::cout << "D:" << d << "\n";
}


int main()
{
    func(2.3);   // OK
    func(2);     // Fails at compile time.
}

【讨论】:

  • 谢谢,我试过这种方法,它可以工作,但我想我会在我的 makefile 中使用 -Werror=conversion 标志。它更简单并且完成了工作。
  • 细微差别:链接时失败,而不是编译时失败。
【解决方案2】:

您无法避免从较低类型到较高类型的隐式转换。但是,您可以反之亦然 如果你的编译器支持 C++0x。

void func(int x){}

int main()
{
   func({2.3}); // error: narrowing
}

【讨论】:

  • 我发现了一个标志,它发送警告(-Wconversion)但是转换的方向。但我仍在寻找如何发送错误。
  • @Greg Hewgill:是的,它可以在没有错误消息的情况下工作,但这很好。谢谢大家。
  • 我不明白。即使调用 func({2}),g++ -std=c++0x 仍然会返回错误。编译器无法从 initialiser_list 转换为 int,无论列表中有什么。
  • @Prasoon Saurav:不在我的电脑上! (g++ 4.4.0 for mingw32.) C:\Temp>g++ -std=c++0x foo.cpp foo.cpp: In function 'int main()': foo.cpp:5: error: cannot convert '' 到 'int' 用于参数 '1' 到 'void func(int)'
【解决方案3】:

我认为马丁的答案是正确的方法。 它可以在链接时找到转换。 如果必须在编译时查找,可以添加static_assert 或 与函数模板类似:

template<typename T>
void func( T ) {
  //static_assert( sizeof( T ) == 0, "..." ); // if you can use static_assert
  int a[ (sizeof( T ) == 0) ? 1 : -1 ];
}

希望这会有所帮助。

【讨论】: