Подтвердить что ты не робот

Использование decltype для объявления всего самого типа функции (не указатель!)

Итак, у меня есть функция с определенной сигнатурой в файле заголовка, и я хочу объявить другую функцию с той же самой сигнатурой внутри класса без, снова вводя параметры, и, конечно же, надеюсь без макроса... Функция-член также должна иметь дополнительный скрытый параметр, очевидно, указатель this (так как это не статическая функция-член).

Теперь я действительно удивлен, что следующий хак/трюк работает как в GCC, так и в ICC, но я не уверен, что это "законный" С++. Я не особо обеспокоен законностью, если это поддерживаемое расширение, но, к сожалению, я не хочу, чтобы он прерывал обновление версии компилятора, потому что некоторые люди решили произвольно заблокировать эту полезную функцию, поскольку стандарт говорит "нет" (такой материал действительно раздражает меня, если честно).

Вот что я имею в виду:

// test.hpp
int func(int x) { return x; }

struct foo
{
  decltype(func) fn;  // <-- legal?
};

int test()
{
  return foo().fn(6);
}


// then in test.cpp
int foo::fn(int x) { return x + 42; }

Это работает (с GCC и ICC), но я не знаю, является ли это "законным" в стандарте. Я прошу только быть уверенным, что это законно, и в будущем он не перестанет работать.

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

В принципе, это то же самое, что объявление int fn(int x); в структуре и то, как он работает в настоящее время.

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

4b9b3361

Ответ 1

Это выглядит законным; но при определении вы должны перепечатать. Вместо этого рассмотрите возможность использования совершенной пересылки.