Этот образец кода действителен?Возвращает стандартную стандартную ссылку?
using ref = char&;
ref foo(ref x) {
return ref{x};
}
int main() {
char a;
foo(a);
return 0;
}
кажется, что:
- лязг 3,5 говорит ДА
НКУ 4,9 говорит не
main.cpp: In function 'char& foo(ref)': main.cpp:4:15: error: invalid cast of an rvalue expression of type 'char' to type 'ref {aka char&}' return ref{x}; ^
http://coliru.stacked-crooked.com/a/cb6604b81083393f
Какой компилятор прав? или это неуказано?
Это очень легко, поэтому преодолеть Gcc ошибку сборки по:
используя круглые скобки вместо фигурных скобок
ref foo(ref x) { return ref(x); }
называя возвращенное значение
ref foo(ref x) { ref ret{x}; return ret; }
вариант 1. прерывает равномерную инициализацию, вариант 2. добавляет бесполезную строку кода.
Похожий вопрос уже был aked здесь: Why can't I initialize a reference in an initializer list with uniform initialization?
Но упомянутый pr50025 фиксируется в GCC 4.9.
Я знаю, что выше образца кода довольно бесполезно, , но я упростил его намеренно, чтобы указать на проблему. В реальных проблемах жизни кода может быть скрыт в общей функции, как:
#include <utility>
template <typename Tp, typename... Us>
Tp bar(Us&&... us) {
return Tp{std::forward<Us>(us)...};
}
Опуская 'Tp' в выбросе оператор возврата' 'Tp's с explicit' конструкторах ... Общая функция уже не так обобщена –
@KarolWozniak Это хороший момент. С другой стороны, то, что у вас уже есть (все три версии), требует доступного экземпляра копирования или перемещения, поэтому он уже не является таким общим, каким он мог бы быть. У меня нет хорошей альтернативы, которая охватывает все возможные типы, извините. – hvd