Почему operator () функтора без сохранения состояния не может быть статическим?

Почему operator () функтора без сохранения состояния не может быть static? Лямбда-объекты без сохранения состояния можно преобразовать в указатели на свободные функции, имеющие ту же сигнатуру, что и их operator ().

Стефан Т. Лававей на с. 6 указывает, что преобразование в указатель на функцию - это просто operator FunctionPointer() (цитировать). Но я не могу получить соответствующий указатель на operator () для функции, не являющейся членом. Для функтора struct F { void operator () () {} } кажется невозможным преобразовать &F::operator () к экземпляру типа using P = void (*)();.

код:

struct L
{
    static
    void operator () () const {} 
    operator auto () const
    { 
        return &L::operator ();
    }
};

Ошибка

  

перегруженный оператор () не может быть статической функцией-членом

но operator () не перегружен.

12 голосов | спросил Orient 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 09:53:01 +0300 2015, 09:53:01

4 ответа


0

В соответствии со стандартом 13,5 /6,

  

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

Кроме того, в 13.5.4 указано, что

  

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

ответил SingerOfTheFall 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 10:00:17 +0300 2015, 10:00:17
0

Я думаю, что нет технической причины запрещать это (но, будучи не знакомым с де-факто кросс-вендором C ++ ABI (Itanium ABI), я ничего не могу обещать).

Однако об этом есть эволюционная проблема в https: //cplusplus.github. io /EWG /ewg-active.html # 88 . На нем даже есть отметка [tiny] , что делает ее несколько «тривиальной» рассматриваемой функцией.

ответил Johannes Schaub - litb 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 10:13:01 +0300 2015, 10:13:01
0

Я не вижу никаких технических причин, чтобы запретить static auto operator()( ... ). Но это особый случай, поэтому было бы сложно добавить в него стандарт. И такое усложнение не является необходимым, потому что им очень легко подражать:

struct L
{
    static void func() {}

    void operator()() const { func(); }

    operator auto () const
    { 
        return &L::func;
    }
};

Смотрите ответ Йоханнеса для получения некоторой полезной дополнительной информации.

ответил Cheers and hth. - Alf 27 72016vEurope/Moscow11bEurope/MoscowSun, 27 Nov 2016 22:42:15 +0300 2016, 22:42:15
0

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

Операторы Glob синтаксически похожи на конструкторы.

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

static MyClass::operator()(...);

Это было сделано просто невозможно, потому что комитет принял решение по непонятным причинам. Я был бы очень рад, если бы мог поговорить с одним из их членов, спросить, что у них на уме, когда они так решили. К сожалению, он, вероятно, не поймет мой вопрос, потому что он никогда не программировал на С ++. Он работал только над своими документами.

Теперь им нужно несколько десятилетий

  • дебаты
  • консультации
  • встречи
  • и соображения

для реализации тривиальной функции. Я подозреваю, что эта функция может быть доступна в c ++ 3x, а на эмулируемых машинах ее можно даже опробовать.

До этого вы можете попытаться написать:

MyClass::MyClass(...);

В обоих случаях вы можете вызвать MyClass(...);.

Конечно, это полезно, главным образом, если MyClass является одиночным. И я бы сказал, что это взломать. Кроме того, он выделяет sizeof(MyClass) в стеке, что может отрицательно сказаться на производительности /эффективности.


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

ответил peterh 27 72016vEurope/Moscow11bEurope/MoscowSun, 27 Nov 2016 22:13:48 +0300 2016, 22:13:48

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132