sky*_*ack 9 c++ templates language-lawyer variadic-templates c++11
这是对这个问题的后续跟进.
请考虑以下代码:
#include <type_traits>
template<typename T, typename... P, typename U = std::enable_if_t<std::is_integral<T>::value>>
void f() { static_assert(sizeof...(P) == 0, "!"); }
int main() {
f<int>();
}
Run Code Online (Sandbox Code Playgroud)
它编译,但根据[temp.res]/8它是不正确的,不需要诊断,因为:
可变参数模板的每个有效特化都需要一个空模板参数包
现在考虑这个略有不同的例子:
#include <type_traits>
template<typename T, typename... P, typename U = std::enable_if_t<std::is_integral<T>::value>>
void f() { static_assert(sizeof...(P) == 0, "!"); }
template<>
void f<int, int>() { }
int main() {
f<int, int>();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,存在有效的完全显式特化,参数包不为空.
这是否足以说代码不再格式错误?
注意:我不是在寻找替代方法,例如将其std::enable_if_t放入返回类型或类似方法.
[temp.res] / 8谈论的是模板声明 s,而不是实体。也就是说,它谈论的主要模板和部分特独立 ; 这些“模板”必须各自具有有效的专业化规则。否则,该段落中的第一个项目符号必须以相同的方式进行解释,这绝对不会赋予其预期的含义。
template <typename T>
void f() {T+0;} // wouldn't be allowed to diagnose this, because there could be an
// explicit specialization that doesn't contain this statement...?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |