Все ли переменные constexpr неявно встроены?
Я играл с параметрами автоматического шаблона и был удивлен, что этот код не скомпилирован:
constexpr auto bar = 2;
template<auto& T>
struct Foo {
auto operator()() const { return T; }
};
int main() {
Foo<bar> b;
b();
}
Visual Studio 15.7 (превью 4) выкладывает эти ошибки:
error C2970: 'Foo': template parameter 'T': 'bar': an expression involving objects with internal linkage cannot be used as a non-type argument note: see declaration of 'Foo' note: see declaration of 'bar' error C2440: 'specialization': cannot convert from 'int' to 'int &' note: see reference to class template instantiation 'Foo<0>' being compiled error C2973: 'Foo': invalid template argument 'int' note: see declaration of 'Foo'
Затем после добавления inline
, ошибка ушла!
constexpr inline auto bar = 2;
я думал constexpr
переменные были неявно inline
, Кроме того, как это влияет на связь моей переменной bar
?
1 ответ
Решение
Все ли переменные constexpr неявно встроены?
Нет. Только функции constexpr и члены-статические данные constexpr неявно встроены ( [dcl.constexpr] / 1).
Кроме того, как это влияет на связь моей переменной панели?
Переменная constexpr const
( [dcl.constexpr] / 9). Не встроенный const
переменная, которая не объявлена явно extern
имеет внутреннюю связь ( [basic.link] / 3).