【问题标题】:Can a nonstatic member of a template specialize to data or function?模板的非静态成员可以专门用于数据或函数吗?
【发布时间】:2015-03-18 01:13:01
【问题描述】:

GCC、Clang、ICC 和 MSVC 都拒绝此代码,但我在 C++ 标准的最新工作草案中没有发现任何违反规则。

该规则已经在标准中,还是在缺陷报告中?

#include <type_traits>

template< typename t >
struct s {
    std::conditional_t< std::is_integral< t >::value, t, void() > mem;
};

s< int > a;
s< void * > b;

【问题讨论】:

  • 你认为void() 应该评估什么?
  • @StenSoft void() 只是 mem 的类型。您无法评估 s&lt;void*&gt;::mem,因为它是未实现函数的名称。但这超出了问题的范围。
  • void()函数类型,一般用于模板类型推导,不定义或声明var。
  • @RonTang 是的,通常。但是,language-lawyer 的问题通常超出常规范围。

标签: c++ templates language-lawyer


【解决方案1】:

由于14.3.1/3,代码无效:

如果声明通过依赖于模板参数的类型获取函数类型,这会导致 不使用函数声明符的句法形式来具有函数类型的声明,程序 格式不正确。

这里声明的类型依赖于模板参数t,因此不能是函数类型。

【讨论】:

  • 啊,谢谢!永远不会在那里寻找它。该规则正在讨论类型依赖性,它也适用于本地范围。恕我直言,最好将其放在 [temp.dep.type] §14.6.2.1 中。
  • ……顺便说一下,MSVC 和 ICC (v13.0.1) 无法在本地范围内诊断它。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
相关资源
最近更新 更多