Конструктор копирования с параметрами по умолчанию никогда не вызывается - PullRequest
6 голосов
/ 01 марта 2012

Почему выходные данные следующей программы просто int3, а не int3&4?

#include <iostream>

class B
{
public:
    explicit B(int i) { std::cout<<"int"<<i; }
    B(const B& rhs, int i = 0) { std::cout<<"&"<<i; }
};

int main(int, char**)
{
    B b(B(3), 4);
}

Команда: clang++ test.cpp -O0

Компилятор: Apple clang версии 3.0 (теги / Apple / clang-211.12) (на основе LLVM 3.0svn)

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Похоже, вы, возможно, нашли причуду компилятора:)

Если вы измените версию компилятора на любую версию, отличную от LLVM 3.0, то вы получите int3 & 4.

Это напечатает int3 & 4 на LLVm 3.0так что, похоже, это связано с тем, что B (3) является временным объектом:

class B
{
public:
    explicit B(int i)
    { 
        std::cout<<"int"<<i; 
    }
    B(const B& rhs, int i = 0) 
    { 
        std::cout<<"&"<<i; 
    }
};

int main(int, char**)
{
    B a(3);
    B b(a, 4);
}
1 голос
/ 03 апреля 2012

Это была ошибка в clang , в которой с тех пор исправлено . Copy-elision неправильно применялась к вызову конструктора, потому что clang не проверял, сколько аргументов было предоставлено, прежде чем сделать вывод, что это была конструкция копирования.

Исправление будет в следующей версии Clang 3.1.

0 голосов
/ 01 марта 2012

Скорее всего, RVO и NRVO съели ваш код. Эти особые условия позволяют компилятору автоматически удалять копии объектов, которые в противном случае были бы применены языком. Поскольку в результате не было сделано ни одной копии, код никогда не печатает инструкцию в конструкторе копирования.

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