在C++中使用的奇怪声明

101*_*010 19 c++ c++11

stackoverflow的上一个问题中的一段代码中,我看到了这个,对我来说很奇怪,声明using:

template <std::size_t SIZE> 
class A
{
public:
  ...
  using const_buffer_t = const char(&)[SIZE];
  ...
};
Run Code Online (Sandbox Code Playgroud)

有人可以解决以下问题:

  1. 它代表什么类型?
  2. 我们在哪里需要这种声明?

Nik*_*iou 18

这是一个类型别名,自c ++ 11以来可用的新语法.

你实际上做的是typedefing数组类型

const_buffer_t 
Run Code Online (Sandbox Code Playgroud)

将是一个长度为= SIZE的const char数组

  • 确切地说,您还应该提到它是数组的左值引用. (4认同)

Mat*_*lia 14

using声明是C++ 11中引入的新语法; 它引入了一个类型别名,指定它const_buffer_t现在是该类型的别名const char(&)[SIZE].在这方面,这种使用using基本上与a相同typedef(尽管using类型别名更灵活).

至于我们所讨论的实际类型(const char(&)[SIZE]),它是对大小数组的引用SIZE; 对数组的引用很少使用,但可以使用它们:

  • 如果在某些函数中你想强制接收对特定大小的数组而不是泛型指针的引用,你可以用数组引用来做到这一点(注意,即使你int param[5]在函数声明中写入它被解析为int *);
  • 同样适用于对数组的引用(明确记录您正在返回对特定大小的数组的引用);
  • 更重要的是,如果你想动态分配"真正的"多维数组(与指向单维数组的指针数组或"平面数组"与"手动2d寻址"相对),你必须使用它们.

另请参阅数组常见问题解答,其中详细解释了大部分内容.

  • OP明确询问它代表什么类型,我正在谈论它(别名类型是我的第一句话的主题),特别是因为对数组的引用鲜为人知,有用性有限并且语法笨拙.这里的"using"声明主要是一个意外,在这里被用作`typedef`的C++ 11花式裤版本.是的,你可以说很多关于"new"`using`的其他内容,但是由于我对奇怪的数组引用的关注,我刚才说了在这种情况下如何使用`using`的基本要点. (2认同)