Позволяет ли перегрузка оператора функции создавать объекты, которые синтаксически работают как функции в C ++? - PullRequest
0 голосов
/ 17 марта 2019

Мне попался следующий вопрос:

Перегрузка оператора функции

a.Требуется класс с перегруженным оператором.

б.Требуется класс с оператором перегруженного ().

c.Позволяет создавать объекты, которые действуют синтаксически как функции.

д.Обычно используют конструктор, который принимает аргументы.

Ответ дается как (а), тогда как, насколько я понимаю, правильный ответ должен быть (с).Моя логика заключается в том, что operator () может быть перегружен как в классах, так и в структурах.Следовательно, это исключает варианты (а) и (б).Более того, когда operator () перегружен, созданные объекты будут в основном работать как функции.

Например, если мы рассмотрим следующее:

struct A {
      void operator()(char c) { }
};

int main() {
        A a;
        a('z'); // operator() is invoked, hence  works like function
}

Пожалуйста, дайте мне знать, где я ошибаюсь вэтот.Этот вопрос беспокоит меня уже некоторое время.Спасибо

1 Ответ

1 голос
/ 17 марта 2019

struct и class оба создают типы, которые являются классами в C ++.Так что логика не работает.

Как и большинство вопросов с множественным выбором, это мусор.

"оператор функции" - неоднозначно.Может быть, относится к оператору "вызов функции".Или, может быть, оператор указателя приведения к функции.http://eel.is/c%2B%2Bdraft/over.call как предположение.Так что я пойду с этим.

c.Позволяет создавать объекты, которые действуют синтаксически как функции.

Что такое "как"?Ни один объект не может действовать синтаксически идентично имени функции;имена функций действительно странные звери в C ++.Любая степень сходства или различия может оправдать или противопоказать этот ответ.Двусмысленная чепуха.

a.Требуется класс с перегруженным оператором.

Хорошо, правда;Я не знаю, как перегрузить вызов функции, не перегружая оператор класса (или используя лямбду, которая просто делает это за меня).

b.Требуется класс с оператором перегруженного ().

Преимущественно верно.Или, другими словами, false.

template<auto x>
using k=std::integral_constant<std::decay_t<dexltype(x)>,x>;

затем

void foo(){}

k<foo> not_foo;

not_foo не перегружен operator() все же not_foo() можно считать перегрузкой вызова функции.

Однако он имеет перегруженную неявную приведение к указателю на функцию.Который может быть выбран, когда вы выполняете вызов функции.

Таким образом, b неверно, может быть.

Вопрос разбивает волосы, не будучи точным.Пожарный инструктор, возьми лучше.

...