Сделать связывание внешним для специализированного шаблона с параметром auto template, являющимся лямбда-выражением (C ++ 20) - PullRequest
0 голосов
/ 23 сентября 2019

Не уверен, что это соответствует стандартам, потому что еще нет окончательного стандарта C ++ 20, и я не знаю, что об этом могут говорить существующие стандарты.

clang 9 в Compiler Explorer не 't компилируется, но GCC 9 с -std = c ++ 2a делает.

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

static constexpr auto commonlambdainheader=[]{};
template<auto L> struct TS {};

using Sl = TS<commonlambdainheader>;
using Si = TS<3>;

template<class C> extern int func(int i);
template<class C> int func(int i) {return i;}

// not external, but visible with a mangled name at -O0
template<> int func<Sl>(int i);
template<> int func<Sl>(int i){ return 3; } 

// externally visible and name demangled
template<> int func<Si>(int i);
template<> int func<Si>(int i){ return 4; }
...