临时对象创建是否依赖于C ++编译器?

时间:2011-09-14 03:19:20

标签: c++ compiler-construction

临时对象创建是否依赖于编译器?

在下面的代码中,我调用一个发送char *的函数,但该函数需要一个Object引用。但是,Object有一个使用char *的构造函数。因此,会自动创建一个临时对象并将其发送到print函数。

class Object {
    string text;
  public:
    Object ( const char* value ) { text = value; }
    void print() const { printf( "[%s]\n", text.c_str() ); }
};

void print( const Object& obj ) { obj.print(); }

int main() {
    print( "hello" );
}

这种行为是否取决于编译器? 您可以在此处查看输出:http://codepad.org/AABw5Ulz

2 个答案:

答案 0 :(得分:3)

你的案子非常明确。这甚至不是临时可能会或可能不会被淘汰的情况。相反,您的print函数需要 Object - 类型参数,因此必须构建一个。

在您的情况下没有任何替代选择的空间,因此 可能依赖于编译器。如果您想要一个可以进行优化的情况,可以考虑按值传递参数:void print(Object);。现在由编译器决定临时对象是复制一次还是直接在目标函数中构造。那是因为明确允许复制构造函数被省略。

答案 1 :(得分:2)

声明这样的构造函数时

 Object ( const char* value )

这意味着编译器可以执行隐式转换

所以不,它不是编译器相关的功能,而是它的设计。

只需将编译器带到"hello"并将其传递给Object构造函数,然后再将其发送到print(const Object &obj)函数。