Зависит ли создание временных объектов от компилятора C ++? - PullRequest
1 голос
/ 14 сентября 2011

Зависит ли создание временного объекта от компилятора?

В приведенном ниже коде я вызываю функцию, отправляющую символ *, но функция требует ссылки на объект.Однако у 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" );
}

Зависит ли это поведение от компилятора?Вы можете увидеть вывод здесь: http://codepad.org/AABw5Ulz

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Ваш случай довольно ясен. Это даже не ситуация, когда временные люди могут или не могут быть исключены. Скорее, ваша print функция требует аргумента Object -типа, поэтому его обязательно нужно будет построить.

В вашей ситуации нет места альтернативам, поэтому нет ничего, что могло бы зависеть от компилятора. Если вам нужна ситуация, которая оставляет место для оптимизаций, вы можете рассмотреть возможность передачи аргумента по значению: void print(Object);. Теперь дело за компилятором, будет ли временный объект скопирован один раз или создан непосредственно в целевой функции. Это потому, что конструкторы копирования явно разрешены для исключения.

2 голосов
/ 14 сентября 2011

Когда вы объявляете такой конструктор

 Object ( const char* value )

, это означает, что компилятор может выполнить неявное преобразование .

Так что нет, это не зависит от компилятора, ноэто путем desing.

Компилятору просто разрешено взять ваш "hello" и передать его в конструктор Object перед отправкой его в функцию print(const Object &obj).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...