在g ++编译器中带引用参数的构造方法

时间:2010-08-04 13:35:32

标签: c++

查看以下代码

标题文件:

class CxUser
{ 
public:
    CxUser(string& guid) {} 
};

我有一个使用CxUser(string("xxx-xxx-x-xxxx"))实例化该类的c ++文件。但是这个语句无法用g ++编译,错误“ 没有匹配函数来调用CxUser :: CxUser(std :: string) ”,而它在VC ++中编译。令人惊讶的是,下面的一段代码实例化了这个类。

string guid("xxx-x-xxxx-xxx-xx"); CxUser user(guid);

任何帮助都将不胜感激....

3 个答案:

答案 0 :(得分:12)

你需要:

class CxUser{ public: CxUser(const string& guid) {} }

当你说:

CxUser c( "foobar" );   // or whatever

从characterv数组创建临时字符串对象。在C ++中,您不能将非const引用绑定到临时对象。

答案 1 :(得分:2)

您要求传递对字符串的引用 - 实质上是指向存储它的位置的指针。但是当你创建这样的匿名临时时,它并没有被存储在任何地方---“那里没有” - 没有什么可以通过的。通过将其存储在指定的临时文件中,您可以为其提供一个可以使用的位置。

当您使用非const引用作为参数时,您暗示您将更改不存在的引用,因此您无法更改它。当你使用const引用时,编译器知道你不能改变它,所以它可以做一些魔术,以便匿名临时引用参数工作。

答案 2 :(得分:1)

我认为如果你让构造函数接受const std::string&,那么CxUser(string("xxx-xxx-x-xxxx"))就可以了。