Кажется, вы хотите «скопировать» подпись другой функции, чтобы создать функцию с такой же подписью.Поскольку decltype(foo)
действительно является типом функции (а не указателем на эту функцию, которая будет decltype(&foo)
и приведет к объявлению указателя), вы можете использовать ее для объявления функции с той же сигнатурой, что и у другой функции..
Как указано в сообщении об ошибке компоновщика:
undefined reference to `Bar::blubb(int)'
это будет нормально работать с вашим компилятором.Однако кажется, что gcc еще не полностью реализовал эту часть стандарта, так как он не будет принимать синтаксис для того же самого с оператором вызова функции.Кланг между прочимс радостью примет его, и ссылка затем выдаст ошибку
undefined reference to `Bar::operator()(int)'
Ваш вопрос о том, почему существует эта ошибка компоновщика, указывает на неправильное понимание того, что на самом деле делает decltype., не больше.Определение blubb
никоим образом не связано с определением foo
.Это может быть понятнее, когда вы пишете это как
typedef decltype(foo) x;
x blubb;
Теперь вы можете альтернативно ввести typedef x, чтобы он был явно типом функции, который никоим образом не изменит то, что blubb.Вы все еще должны определить это.А поскольку нет синтаксиса для его определения с использованием decltype, вам явно нужно записать его как
int Bar::operator()(int) {
...
}
, что, скорее всего, и, к сожалению, отрицательно скажется на цели / преимуществе использования decltype для объявления, поскольку это не позволитВы автоматически «копируете» подпись.