C ++中模板参数中的三元表达式

时间:2018-02-04 17:20:39

标签: c++ gcc visual-c++ compiler-errors clang

考虑以下(人为)示例:

template <int N>
struct S {};

template <typename T>
S<1 ? 42 : 24> f() { return {}; }

使用MSVC 19 2017(https://godbolt.org/g/K58FMr)进行编译会产生一系列错误:

<source>(5): error C2059: syntax error: '<end Parse>'
<source>(5): error C2976: 'S': too few template arguments
<source>(2): note: see declaration of 'S'
<source>(5): error C2988: unrecognizable template declaration/definition
<source>(5): error C2059: syntax error: '{'
<source>(5): error C2143: syntax error: missing ';' before '{'
<source>(5): error C2447: '{': missing function header (old-style formal list?)

虽然clang和gcc都成功编译了它。这是MSVC中的错误还是我做错了什么?

P.S。我知道1 ? 42 : 24可以简化。这里特别是在一个可重复的小案例中证明这个问题。

1 个答案:

答案 0 :(得分:2)

MSVC在解析它时会出错。这都是有效的C ++。你可以通过添加括号来帮助它:

template <int N>
struct S {};

template <typename T>
S< (1 ? 42 : 24) > f() { return {}; }

See it live