临时对象创建是否依赖于编译器?
在下面的代码中,我调用一个发送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
答案 0 :(得分:3)
你的案子非常明确。这甚至不是临时可能会或可能不会被淘汰的情况。相反,您的print
函数需要 Object
- 类型参数,因此必须构建一个。
在您的情况下没有任何替代选择的空间,因此 可能依赖于编译器。如果您想要一个可以进行优化的情况,可以考虑按值传递参数:void print(Object);
。现在由编译器决定临时对象是复制一次还是直接在目标函数中构造。那是因为明确允许复制构造函数被省略。
答案 1 :(得分:2)
声明这样的构造函数时
Object ( const char* value )
这意味着编译器可以执行隐式转换。
所以不,它不是编译器相关的功能,而是它的设计。
只需将编译器带到"hello"
并将其传递给Object
构造函数,然后再将其发送到print(const Object &obj)
函数。