Есть шаблонная декларация с возвращаемым типом auto
и без «trailing return type». GCC и Clang едят. Такое вообще легально?
Код:
foo.h
#pragma once
#include <string>
#include <utility>
class Foo {
public:
explicit Foo(std::string name) : _name{std::move(name)} {}
void bar() const;
private:
template <typename Callback>
auto wrap(Callback&& c) const; // <-- !!!
const std::string _name;
};
foo.cpp
#include "foo.h"
#include <iostream>
template <typename Callback>
auto Foo::wrap(Callback&& c) const {
return [&]() {
std::cout << "das ist ein Wrapper aus " << _name << '\n';
c();
};
}
void Foo::bar() const {
auto f = wrap([]() { std::cout << "das is ein Lambda\n"; });
f();
}
main.cpp
#include "foo.h"
int main() {
Foo foo{"Foo #1"};
foo.bar();
}
Выводит (как и задумывалось):
das ist ein Wrapper aus Foo #1
das is ein Lambda
GCC: https://wandbox.org/permlink/jXIrkG0U13I9ZRnP
Clang: https://wandbox.org/permlink/6hs2OoxNpzhnu9iX