C++ 这是“的论点”;使用;要创建已建立的类型别名?

C++ 这是“的论点”;使用;要创建已建立的类型别名?,c++,templates,alias,typedef,language-design,C++,Templates,Alias,Typedef,Language Design,C++11中有一种新语法,用于创建类型别名,使用。它可以在使用typedef的地方使用,并且可以模板化。支持使用的方法如下: 有人建议(重新)使用关键字typedef-如 论文[4]-介绍模板别名: template<class T> typedef std::vector<T,MyAllocator<T>> Vec; 可以理解为:从现在起,我将使用Vect作为std::vector的同义词。有了这样的解读,别名的新语法似乎合乎逻辑 然而,我不明白。我们对类

C++11中有一种新语法,用于创建类型别名,
使用
。它可以在使用
typedef
的地方使用,并且可以模板化。支持使用的方法如下:

有人建议(重新)使用关键字typedef-如 论文[4]-介绍模板别名:

template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;
可以理解为:从现在起,我将使用
Vect
作为
std::vector
的同义词。有了这样的解读,别名的新语法似乎合乎逻辑

然而,我不明白。我们对类和函数使用模板,并且没有单独的关键字。那么为什么我们对
typedef
有一个单独的关键字呢

即:

class-Foo{
};
模板
分类栏{
};
我们对
Foo
Bar
都使用
class
Foo
是一个实际的类,而
Bar
是一个模板,是类的“集合”

有人能解释一下吗?

除了(IMO)更大的可读性参数之外,别名模板不仅仅是别名(就像typedef一样,您无法以任何方式区分typedef和它们的别名类型):它们真正代表了一系列类型,例如,您可以编写:

template<class T>
using foo = ...;
template<template<typename> class TT> void bar();
bar<foo>();
模板
使用foo=。。。;
模板空白条();
bar();

所以富不仅仅是一个别名,它是一个不同的野兽;使用typedef可能会让人困惑。。。我认为这就是“Vec不是一个类型的别名,不应该被视为一个typedef名称”的意思。

我觉得它是基于大量的观点。可能没有令人满意的答案。首先,
使用
语法感觉更自然(至少对某些人来说)。但除此之外,我不知道。也许有人有足够的内部信息来提供技术推理。。。或者确认没有。是的,除非有具体的技术理由反对,答案只会是‘因为委员会这么说’<代码>使用在语法上更加一致:这样,您总是编写
模板[category:class | using | function | etc.][identifier][definition]
您链接的线程中的解释是什么?现在你的问题对我来说似乎是多余的(这并不是故意的侮辱,只是我看不出这里有什么不同,所以请帮帮我:-)@下划线\d该模式不适用于函数。您没有编写
模板函数foo=t(tx){return x+1;}
,所以我不明白为什么不能以同样的方式将其扩展到
typedef
。@AndyG:请再次阅读我的问题。我不是在问
使用
背后的原因。并询问对其的解释,它是否已经确立。链接的答案中没有写这方面的内容。为什么会让人困惑?为什么对类型和模板都使用
class
?同样的原则。他们可以像赫伯建议的那样添加模板化的typedef。模板化的typedef(如果他们选择了这种方式…)有什么让人困惑的地方,这并不让abot模板化的类感到困惑?@geza,这不是相同的原理;类声明一个新类型,template类声明一个新的类型族VS typename声明一个类型别名,templateusing声明一个新的类型别名族;如上所述,typedef只引入了一个新名称,templateusing引入了一个新实体hmm
class
声明一个新类型,
template class
声明一个新的类型族VS
typedef
声明一个类型别名,
template typedef
声明一个新的类型别名族。对我来说,这似乎是相同的原则(如果这是现实的话)。
foo
不仅仅是一个别名,但理论上我们可以制作
模板类型定义。。。foo2通过使
foo2
仅为别名而有效;i、 e.
bar
在此实施下无效。这类似于Haskell中的参数化
type
。@geza,换句话说,给定templatetypedef和通常的typedef语义,您是否希望编译上面的bar()调用?
class Foo {
};

template <typename>
class Bar {
};
template<class T>
using foo = ...;
template<template<typename> class TT> void bar();
bar<foo>();