是否临时对象的创建依赖于c++编译器

Does temporary object creation depends on the C++ compiler?

本文关键字:c++ 编译器 依赖于 创建 临时对象 是否      更新时间:2023-10-16

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

在下面的代码中,我调用了一个发送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

你的情况很清楚。在这种情况下,临时工可能会被忽略,也可能不会被忽略。相反,您的print函数需要一个Object类型的参数,因此必须构造一个。

在您的情况下,

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

当你声明这样的构造函数

 Object ( const char* value )

意味着编译器可以做一个隐式转换

所以不,它不是编译器依赖的特性,但它是通过设计的。

编译器只允许取"hello"并在将其发送到print(const Object &obj)函数之前将其传递给Object构造函数。