Есть шаблонная декларация с возвращаемым типом 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









 ,






URL записи