为啥 msvc 让我这样做而不是 gcc / g++?

Posted

技术标签:

【中文标题】为啥 msvc 让我这样做而不是 gcc / g++?【英文标题】:Why does msvc let me do this but not gcc / g++?为什么 msvc 让我这样做而不是 gcc / g++? 【发布时间】:2010-10-09 20:13:28 【问题描述】:

在 msvc 中,我有这样的函数并且它可以构建,但在 gcc 中它不喜欢它。

void classname::a(std::string &text)

    stdStringFromClass = text;


void classname::b(char *text)

    a(std::string(text));

这里的问题在于 &,gcc 我认为我担心因为我刚刚创建了那个 std::string,所以通过引用传递是有风险的,所以它不会构建,但是 msvc 甚至没有警告我。

为什么 c++ 对 gcc 不正确?我一直听说 msvc 比 gcc 更严格。

谢谢

错误

AguiWidgetBase.cpp: In member function ‘void AguiWidgetBase::setText(char*)’:
AguiWidgetBase.cpp:91:27: error: no matching function for call to ‘AguiWidgetBase::setText(std::string)’
AguiWidgetBase.cpp:80:6: note: candidates are: void AguiWidgetBase::setText(std::string&)
AguiWidgetBase.cpp:88:6: note:                 void AguiWidgetBase::setText(char*)

这样可以吗?

void classname::a(std::string &text)

    stdStringFromClass = text;


void classname::b(char *text)

   std::string k = text;
    a(k);

【问题讨论】:

需要更多上下文。你得到什么错误,什么是“stdStringFromClass”等等。 stdStringFromClass 是一个 std::string MSVC 并不比 gcc 更严格,这对我来说似乎相当倒退。错误是临时不能绑定到非常量引用。但是,当您显示的代码很少时,很难告诉您解决方案。需要修改参数吗?如果没有,请将其设为常量引用。 char*(应该是const char*)和std::string 过载有什么意义? std::string 可以从 const char* 隐式构造。 真的吗?你能有一个名为class的类吗? @GMan:谢谢,我知道。我对class 一直用作类名的问题文本感到惊讶。由于 SO 已存档,我认为这不是存档的好例子。我的评论应该是幽默的:(虽然我没有放笑脸:) 【参考方案1】:

我认为这是 Visual Studio 从那时起就支持的旧编译器扩展,但它保留在现代 Visual C++ 中以保持兼容性。尝试禁用编译器扩展(/Za 标志),看看会发生什么。

或者,使用/W4 标志获得最大警告,它应该抱怨:

警告 C4239:使用了非标准扩展

在 GCC 上,我得到 const 引用错误:

错误:从“std::string”类型的临时变量中“std::string&”类型的非常量引用的初始化无效

【讨论】:

【参考方案2】:

我不知道为什么 Visual Studio 允许你编译它,但你不能传递对匿名对象的引用。

编辑:它可以用于 const 引用,因为您可以将临时对象作为引用传递,只是能够修改它没有意义。这就是我们在 C++0x 中使用右值引用的原因。

Edit2:对于您的编辑,是的,这可以解决问题,或者只是将 const 引用作为 a() 方法中的参数,您似乎没有修改参数。

【讨论】:

哦,你应该看看 msvc 让我做的其他一些事情:p const 引用可以工作。我猜测的错误是:“str.cpp:11:错误:从‘std::string’类型的临时值对‘std::string&’类型的非常量引用无效初始化”【参考方案3】:

我相信是别人先说的,但是传递对匿名对象的引用是非法的。 Visual C++ 很奇怪。要修复它,请尝试以下操作:

void class::a(const std::string &text)

    stdStringFromClass = text;


void class::b(const char *text)

    a(std::string(text));

顺便说一句,我假设您的班级名称实际上不是“班级”,而您只是将其用作占位符,因为

class class 
    // ...
;

东西是非法的。

【讨论】:

【参考方案4】:

如果没有实际的错误信息,我只能猜测:class 是一个保留关键字,你应该以不同的方式命名你的类,这不是一个有效的方法定义:

void class::a(std::string &text)  ... 

编辑:问题在于传递匿名引用,正如其他人所指出的那样。你现在可以忽略这个答案。

【讨论】:

以上是关于为啥 msvc 让我这样做而不是 gcc / g++?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 gcc 在非调试版本中添加符号?

为啥 MSVC 在编译宏时大发雷霆,而 G++ 完全是关于禅的?

C++ - 在 Windows 上使用 GCC 而不是 MSVC 值得吗? [关闭]

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

dll 运行时错误(C/C++/GCC/MSVC)

为啥我需要在 g++ 中使用 typedef typename 而不是 VS?