我在相似性上看到了很多代码:
namespace _private {
template <class T>
struct identity
{
using type = T;
};
}
template <class T>
using identity = typename _private::identity<T>::type;
简单之处有什么区别:
template<class T>
using identity = T;
其他样本:
template <typename A>
struct Int4 : std::integral_constant<int, 4> {};
VS
template <typename A>
using Int4 = std::integral_constant<int, 4>;
答案 0 :(得分:4)
::type
标识块模板类型扣除。原始使用没有。
struct
Int4是与积分常数4不同的类型;它只是将常量作为公共父类型。使用不是一种独特的类型。
这两种差异都可能产生广泛的连锁效应,这些效应过于广泛,无法在SO答案中涵盖。
答案 1 :(得分:1)
这个问题的答案实际上是“阅读C ++教科书”,但是,我觉得在使用C ++库时,有一个更加细微的答案是有用的。
typedef
和using
不会声明新类型,而只是现有类型的别名。如果您使用大型库并且希望转发声明定义但定义本身是类型定义的,这可能会导致非常微妙但令人讨厌的错误。
大包括
struct my_s {};
using my_struct = my_s;
// ...
<强>来源
//#include "large_include.h"
struct my_struct;
#include "large_include.h" // compiler error, no issue if we do `struct my_s;`
即使您可能会在当前的C ++理解水平上看到这些名称与非常相似的实体,但编译器对它们的处理方式也大不相同。别名和新类型都很棒:了解它们之间的区别。
此外,添加新类型显然是不同的。
#include <iostream>
#include <type_traits>
struct a {};
struct b: a {};
struct c: a {};
using d = c;
int main()
{
std::cout << std::is_same<b, c>::value << std::endl; // false
std::cout << std::is_same<c, d>::value << std::endl; // true
}