我正在开发一个跨平台代码库,其中初始工作是使用MS VC2010编译器完成的。后来我在Linux上用GCC(4.7)编译它。在很多情况下我收到:
“GCC中没有匹配的调用函数..”错误。我注意到它主要在方法参数非常常引用时抱怨。例如:
void MyClass::DoSomeWork(ObjectSP &sprt, const std::string someName, const std::string anotherName, const std::string path, int index) {
sprt->GetProp()->Update(path, false);
}
我将方法更改为:
void MyClass::DoSomeWork(const ObjectSP& sprt, const std::string& someName, const std::string& anotherName, const std::string& path, int index) {
sprt->GetProp()->Update(path, false);
}
海湾合作委员会停止抱怨。
为什么会发生这种情况,为什么它不会在VC编译器中发生?
答案 0 :(得分:9)
将非const引用绑定到临时引用是非法的。然而,历史上VS编译器对此并不那么严格。
因此,如果你有一个带有非const引用的函数,并且用一个临时对象(例如函数的返回值)来调用它,那么g ++将会得到,但VS不会。在这种情况下,g ++是对的。
如果可以的话,总是喜欢const引用。