Почему неявная перегрузка функций членства преобразования работает типом возврата, в то время как это не позволяется для нормальных функций?

Если вы используете Google Guava , это будет так же просто, как:

byte[] bytes = ByteStreams.toByteArray(inputStream);

6
задан curiousguy 5 December 2011 в 10:25
поделиться

4 ответа

Операторы преобразования на самом деле не считаются разными перегрузками и не вызываются на основании их возвращаемого типа . Компилятор будет использовать их только тогда, когда он должен (когда тип несовместим и должен быть преобразован) или когда явным образом предлагается использовать один из них с оператором приведения.

Семантически, каков ваш код сделать это объявить несколько различных операторов преобразования типов и не перегрузок одного оператора .

11
ответ дан 8 December 2019 в 16:08
поделиться

Это не возвращаемый тип. Это преобразование типа.

Учтите: func () создает объект типа func. Нет никакой двусмысленности относительно того, какой метод (конструктор) будет вызван.

Единственный вопрос, который остается, - это можно ли привести его к желаемым типам. Вы предоставили компилятору соответствующее преобразование, поэтому он доволен.

3
ответ дан 8 December 2019 в 16:08
поделиться

Нет Это действительно техническая причина для предотвращения перегрузки функций на типах результатов. Это делается в некоторых языках, таких как, например, Ada, но в контексте C ++, который также имеет неявные преобразования (и два их вида), полезность уменьшается, и взаимодействие обеих функций быстро приведет к двусмысленности.

Обратите внимание, что вы можете использовать тот факт, что неявные преобразования могут быть определены пользователем для имитации перегрузки по типу результата:

class CallFProxy;
CallFProxy f(int);

class CallFProxy {
   int myParameter;
   CallFProxy(int i) : myParameter(i) {}
public:
   operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
   operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};
1
ответ дан 8 December 2019 в 16:08
поделиться

Overload resolution chooses between multiple candidate functions. In this process, the return type of candidates is indeed not considered. However, in the case of conversion operators the "return type" is critically important in determining whether that operator is a candidate at all.

0
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: