C++ 临时对象的创建是否取决于C++;编译程序?
临时对象的创建是否取决于编译器 在下面的代码中,我调用了一个发送char*的函数,但该函数需要一个对象引用。但是,对象有一个使用char*的构造函数。。因此,会自动创建一个临时对象并发送到打印函数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() );
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
)。