为什么模板参数中的双冒号有效?

吧台

在回答一个问题时,我遇到了这样的代码:

template<class T, class... Ts> void foo();

template <class T, class T::value_type>
void foo() { }

它以代码专用foo模板函数的形式呈现,这是不对的,但这不是我的问题。我想知道为什么编译器class T::value_type在模板参数中允许这样的构造:我的意思是,这很明显是错误的,我无法提出范围运算符可能是参数名称(模板或函数)一部分的任何情况。因此,我有两个问题:

  1. 标准允许它还是在编译器中被忽略?
  2. 如果标准允许,为什么呢?有没有用例?
火箭1111

如评论中所述,它是一个精心设计的类型说明符最好用一个例子解释一下:

int main() {
    struct foo {}; // ok
    int foo = 0; // ok

    int test = foo; // ok, refers to variable 'foo'
    foo a; // error, 'foo' refers to variable
    struct foo b; // ok, 'struct' means that name lookup searches for classes only
}

从本质上讲,你可以把它们(的struct/classenum)作为一个更受限制typename,因为它们只允许类或枚举分别。另请注意,typename原始示例中允许这样做

template<class T, class... Ts> void foo();

template <class T, typename T::value_type> // Ok, value_type needs to be a type
//                 ^^^^^^^^^^^^^^^^^^^^^^^ it's a non-type template parameter
void foo() { }

如果您有一个类型和一个具有相同名称的变量,或者要指定一个具有从属名称的东西(例如,在中class T::value_typevalue_type是一个类,没有class之前的名称,那么它将是一个值),则需要使用它。使用a typename。)

我无法想出范围运算符可能是参数名称一部分的任何情况

您唯一想到的是类型模板参数。非类型模板参数可以很好地使用范围运算符来命名类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么将冒号放在变量名之前是js中的有效代码?

url 中的双冒号在 Webview 中无限加载并被视为有效 URL

默认模板参数-不必一定是正确的吗?为什么有效?

为什么这段简短的模板代码有效?

在 django html 详细模板中,为什么 .all 有效,但 .all() 会出错?

在Java中,对super()参数列表中的静态方法的调用是有效的。为什么?

为什么这种bash构造有效?(参数替换)

为什么基于参数的定义比递归更有效?

按地址传递参数,为什么 &(*v) 有效?

为什么这个包含参数的别名有效?

Java中,为什么collections.sort()仍然有效,与非比较类型的参数?

带参数扩展的双冒号有什么作用?

为什么使用双括号“ [[”检查通配符匹配文件是否存在而单括号“ [”有效?

为什么用带引号的空格进行参数扩展在双括号“ [[”内有效而在单括号“ [”内无效?

具有不依赖模板参数的原型的虚函数在模板中是否有效?

为什么是0 C ++中的有效语句?

在C#中,为什么dictionary [0] ++有效?

为什么'\ 117'在Java中是有效的字符文字?

为什么在C ++中插入向量有效?

为什么有时“this”在 Vue 模板中有效而有时无效?

d3行函数仅在行函数中包含哑元参数时有效。为什么?

“ T”不是参数“ T”的有效模板类型参数

通过typedef template <typename T,T>强制模板实例化-为什么有效?

为什么仅形成有效的空可变参差错的模板?

为什么这段代码有效?

为什么此导入有效?

为什么此语法有效?

为什么此输入有效

为什么表格有效?