为什么MSVC可以让我这样做,而GCC / G++却不行?

3
在 msvc 中,我有这样的函数,并且可以构建,但在 gcc 中却不行。
void classname::a(std::string &text)
{
    stdStringFromClass = text;
}

void classname::b(char *text)
{
    a(std::string(text));
}

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

为什么在gcc中这是不正确的c++代码?我一直听说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"是什么?等等。 - vanza
stdStringFromClass 是一个 std::string。 - jmasterx
MSVC并不比gcc更严格,这对我来说似乎相反。错误在于无法将临时变量绑定到非const引用上。但是,当你几乎没有展示代码时,很难告诉你解决方案。你需要修改参数吗?如果不需要,请将其设置为const引用。为什么要同时使用char*(应该是const char*)和std::string重载?std::string可以从const char*隐式构造。 - GManNickG
真的吗?你可以有一个名为 class 的类吗? - Arun
@GMan:谢谢,我知道那个。但是我对问题文本中一直使用class作为类名感到惊讶。由于SO已经存档,我认为这不是一个好的存档示例。我的评论本来是幽默的:(,尽管我没有放笑脸:)。 - Arun
4个回答

6
我认为这是Visual Studio自古以来支持的旧编译器扩展,但为了兼容性而在现代Visual C++中保留。尝试禁用编译器扩展(/Za标志)并查看结果。
或者,使用/W4标志获取最大警告,它应该会发出警告:

warning C4239:使用了非标准扩展

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

error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘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 class {
    // ...
};

这些东西是非法的。


3
我不知道为什么Visual Studio允许你编译这个代码,但是你不能传递一个匿名对象的引用。
编辑:对于const引用是可以的,因为你可以将临时对象作为引用传递,只能修改它没有意义。这就是为什么C++0x中有右值引用的原因。
编辑2:对于你的编辑,是的,那样可以解决问题,或者在a()方法中使用const引用作为参数,因为你似乎不会修改该参数。

哦,你应该看看 MSVC 让我做的其他一些事情 :p - jmasterx
const 引用可以工作。但是,我猜测出现的错误是:“str.cpp:11: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’”。 - vanza

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接