Все ли переменные 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).

Другие вопросы по тегам