C++ 临时对象的创建是否取决于C++;编译程序?

C++ 临时对象的创建是否取决于C++;编译程序?,c++,compiler-construction,C++,Compiler Construction,临时对象的创建是否取决于编译器 在下面的代码中,我调用了一个发送char*的函数,但该函数需要一个对象引用。但是,对象有一个使用char*的构造函数。。因此,会自动创建一个临时对象并发送到打印函数 class Object { string text; public: Object ( const char* value ) { text = value; } void print() const { printf( "[%s]\n", text.c_str() );

临时对象的创建是否取决于编译器

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

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" );
}
此行为是否取决于编译器?
您可以在这里看到输出:

当您声明这样的构造函数时

 Object ( const char* value )
这意味着编译器可以进行隐式转换

因此,不,它不是依赖于编译器的特性,而是通过设计实现的


编译器只需将您的
“hello”
传递给
对象
构造函数,然后再将其发送给
打印(const Object&obj)
函数。

当您声明这样的构造函数时

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" );
}
 Object ( const char* value )
这意味着编译器可以进行隐式转换

因此,不,它不是依赖于编译器的特性,而是通过设计实现的


编译器只需将您的
“hello”
传递给
对象
构造函数,然后再将其发送到
打印(const Object&obj)
函数。

您的情况非常清楚。这甚至不是一个临时职位可能被或可能不被忽略的情况。相反,您的
print
函数需要一个
Object
类型的参数,因此必须构造一个参数

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" );
}

在您的情况下,没有任何选择的余地,因此没有任何东西可以依赖于编译器。如果你想要一个为优化留出空间的情况,你可以考虑通过值传递参数:<代码>无效打印(对象);代码>。现在由编译器决定临时对象是复制一次还是直接在目标函数中构造。这是因为复制构造函数被明确地允许省略。

您的情况非常明确。这甚至不是一个临时职位可能被或可能不被忽略的情况。相反,您的
print
函数需要一个
Object
类型的参数,因此必须构造一个参数


在您的情况下,没有任何选择的余地,因此没有任何东西可以依赖于编译器。如果你想要一个为优化留出空间的情况,你可以考虑通过值传递参数:<代码>无效打印(对象);代码>。现在由编译器决定临时对象是复制一次还是直接在目标函数中构造。这是因为复制构造函数被明确地允许省略。

我认为“允许编译器”不是正确的表达式。没有其他方法,编译器需要构造一个
对象
实例作为函数调用的参数;这将非常烦人……是的,Kerrek SB,这是允许的,但我不确定它是否会做出这样的决定,或者只是显示一个编译错误。@NIGO:正确,您可以依赖所谓的隐式转换,它是由任何可以用一个参数调用的构造函数(而不是声明为
explicit
)提供的。我不认为“允许编译器”是正确的表达式。没有其他方法可以做到这一点,编译器需要构造一个
对象
实例作为函数调用的参数。好的,所以无论我使用什么编译器,我都不会被迫写print(对象(“hello”));这将非常烦人……是的,Kerrek SB,这是允许的,但我不确定它是否会做出这样的决定,或者只是显示一个编译错误。@NIGO:正确,您可以依赖所谓的隐式转换,它是由任何可以用一个参数调用的构造函数提供的(而不是声明为
explicit
)。