Преобразование конструктора как возвращение из функции

Можно ли использовать конструктор преобразования вместо конструктора копирования для возврата объекта из функции, даже если RVO не развит (предположим, что компилятор не поддерживает какие-либо оптимизации)? Суть вопроса в том, что сказал C ++ std, кто-нибудь может мне сказать? Я получил gcc и скомпилировал код ниже с несколькими вопросами в комментарии.



class A
{
public:
A(int) {};
A(int, int) {};

private:
A(const A &) = delete;
A & operator = (const A &) = delete;
};

A foo(void)
{// All the CEs below are all the same, which is 'using the deleted function 'A::A(const A&)''.
//return(0); // Not compiled.
//return(A(0)); // Not compiled. ok since the A isn't be copy-able.
//return {0};  // Compiled. Is it a bug of the compiler?
//return({0}); // Not compiled. What happened when returns in '()' implemented?
//return 0;  // Not compiled. What happened when returns without '()' and '{}' implemented?
//return ({0, 0}); // Not compiled.
return {0, 0}; // Compiled. Realy??

/*
1. What are the differences in 'return 0', 'return {0}', 'return(0)' and 'return({0})'?
2. Is it any possible to do conversion from source type object 'which is 'int' in this sample' to returning type of
the function directly with only ONE constructor call even if the compiler has no any copying eliminating optimization
but full compatibility with STD? Note that the function 'foo' here has no returning object accepter.
*/
}

int main(void)
{
foo(); // Note that there is no accepter of 'A' here, it's not discussing purpose at this topic of the post.
}

// compiling with the gcc ver. 4.8.1.

2

Решение

Да, совершенно правильно вызывать конвертирующий конструктор в операторе возврата, если вы используете инициализированный возвращенный объект с помощью braced-init-list.

Стандарт C ++ 11 говорит об этом в 6.6.3 [stmt.return]:

Значение выражения неявно преобразуется в тип возвращаемого значения функции, в которой оно появляется. Оператор возврата может включать создание и копирование или перемещение временного объекта (12.2). [Замечания: Операция копирования или перемещения, связанная с оператором возврата, может быть исключена или может рассматриваться как значение в целях разрешения перегрузки в
Выбор конструктора (12.8). — конечная нота] Заявление о возврате с приготовился-INIT-лист инициализирует объект или ссылку, которые будут возвращены из функции путем копирования-инициализации списка (8.5.4) из указанного списка инициализатора. [Пример:

std::pair<std::string,int> f(const char* p, int x) {
return {p,x};
}

конец примера]

В другом закомментированном return В операторах вы создаете временный объект, который затем необходимо будет скопировать в возвращаемый объект, для чего требуется доступное копирование ctor.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]