What is the difference between 'typedef' and 'using' in C++11?
我知道,在C++ 11中,我们现在可以使用EDCOX1×0来写类型别名,比如EDCOX1,1,s:
据我所知,相当于:
这种新的句法是从试图表达"template typedef"的努力中产生的:
1
| template< class T > using MyType = AnotherType< T, MyAllocatorType >; |
但是,对于前两个非模板示例,标准中还有其他细微的差异吗?例如,typedef以"弱"的方式进行混叠。也就是说,它不创建新类型,只创建新名称(这些名称之间的转换是隐式的)。
它是与using相同还是生成一个新类型?有什么区别吗?
- 我个人更喜欢新的语法,因为它更像常规变量赋值,提高了可读性。例如,您喜欢typedef void (&MyFunc)(int,int);还是using MyFunc = void(int,int);?
- 我完全同意,我现在只使用新语法。这就是为什么我要问,以确保真的没有区别。
- @ MatthieuM。这两个是不同的btw,应该是typedef void MyFunc(int,int);(实际上看起来不坏),或者using MyFunc = void(&)(int,int);。
- @R.Martinhovernandes:啊,谢谢,我不知道第一种形式,我认为它等于我提出的using形式。事实上,第一个也不错(除了中间有名字)。
- @r.martinhofernandes你为什么需要在using MyFunc = void(&)(int,int);中使用(&;)。这是否意味着MyFunc是对函数的引用?如果省略了&;会怎么样?
- 是的,它是一个函数引用。相当于typedef void (&MyFunc)(int,int);。如果你省略了&,就相当于typedef void MyFunc(int,int);
- 在CPPCast的这一集中,Edouard Alligand声称using导致了更快的链接时间(但不记得他在谈论哪个编译器),因为显然编译器生成的符号名较短。不过,我不知道这是否经得起审查。
- @R.Martinhofernandes什么是typedef void MyFunc(int,int);?
- 不管实际的答案是什么:谢谢@klaim帮助我使用模板语法-您的命名约定比标准代码片段要清楚得多。
- @Willc注意到这两个符号都是标准的,但第一个是"遗留"。
根据标准(重点矿山)(7.1.3.2),它们是等效的:
A typedef-name can also be introduced by an alias-declaration. The
identifier following the using keyword becomes a typedef-name and the
optional attribute-specifier-seq following the identifier appertains
to that typedef-name. It has the same semantics as if it were
introduced by the typedef specifier. In particular, it
does not define a new type and it shall not appear in the type-id.
- 从答案来看,关键词似乎是一个超级的typedef。然后,在将来被分派?
- @Iammilind probably not,but you can code as if it were.
- @Iammilind I don't think so as i t is part of C and certainly will not removed from i t.同时,C+11和未来版本将保持最大的兼容性与我们的当前代码。
- Deprecation doesn't necessarily indicate intent to remove--it melly stands as a very strong recommendation to prefer another means.
- 不想消失。对于一个,目前的标准图书馆设计指南有一个条款"在C++2003 Syntax可以使用的地方,它们在C++2011特性上是先进的"。Of course,in user code no such restrictions apply.
- 但后来我想知道为什么他们不让自己被压制了But then I wonder why they didn't just allow typedef to be templated.我记得他们在哪里引进的usingSyntax precisely because the typedefSemantics didn't work with templates.与using的事实相矛盾的是,确切地说,同样的语言。
- @CELTSCHK:The reason is talked about the proposal n1489一个假名不是一种类型的别名,而是一组假名。要区分typedef和FELT对新句法的需要。同时,在思考行动问题时,始终要考虑到不同版本之间的差异。
- 怎么回事?a Typedef for one of the template template parameters doesn't appear to be suitable as the typedef isn't correct unless it has template parameters specified.这类别名能在这里使用吗?还是等于这类别名的一种类型(而不被使用)?Can the type alias be used here,or is it equivalent to a typedef in this case(and not be used)?还是这是一个模板式别名的解决方案?这是一个外星人和一个典型的人之间的区别,是吗?
- 那么,为什么这是多余的介绍?两个句法用于同一目的。我从来没有见过她。
在模板中使用时,使用语法具有优势。如果需要类型抽象,还需要保持模板参数在将来可以指定。你应该这样写。
1 2 3 4 5 6 7 8 9 10
| template <typename T> struct whatever {};
template <typename T> struct rebind
{
typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};
rebind<int>::type variable;
template <typename U> struct bar { typename rebind<U>::type _var_member; } |
但是使用语法简化了这个用例。
1 2 3 4
| template <typename T> using my_type = whatever<T>;
my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; } |
- 我已经在这个问题上提到这个了。我的问题是,如果你不使用节奏的话,与典型的不同。例如,当你使用食品{Init}{uvalue};{Instead of Food Food}(Init value)}两者都应做同样的事情,但不应完全按照同样的规则行事。所以我想知道是否有类似的隐藏与使用/类型的不同。
它们基本上是相同的,除了:
The alias declaration is compatible with templates, whereas the C
style typedef is not.
它们基本上是相同的,但using提供了alias templates,这非常有用。我能找到一个很好的例子如下:
1 2 3
| namespace std {
template<typename T> using add_const_t = typename add_const<T>::type;
} |
所以我们可以用std::add_const_t代替typename std::add_const::type。
- 就我所知,这是不可避免的行为在上面添加任何东西
- @Someonewithpc I wasn't adding anything,it already exists,I was just showing an example of typename use.请检查en.cppreference.com/w/cpp/types/Add cv