【发布时间】:2012-12-06 12:35:31
【问题描述】:
声明符。是的,声明者。它们是许多编码约定辩论的根源。对于争论来说,这是一个非常好的话题——C++ 并不规定哪个更好(它不在乎!)。所以我们可以写这些,而不用担心有人会取笑你:
int x;
int& a = x;
int &b = x;
int* c = &x;
int *d = &x;
在句法方面,b 和 d 比其他“更有效”。我们需要在名称前加上声明修饰符:
int m, *n; // m is an int; n is a pointer to int
但潮流似乎转向了有利于一个人。使用 C++11 的可变参数模板,声明符的位置似乎仅限于修饰符更接近基类型的形式:
template<typename... Ts>
void VariadicFuncRef(const Ts&... args) { }
^
template<typename... Ts>
void VariadicFuncPtr(Ts*... args) { }
^
写这些表格是错误的:
template<typename... Ts>
void VariadicFuncRef(const Ts... &args) { }
template<typename... Ts>
void VariadicFuncPtr(Ts... *args) { }
具体例子请点击here。
所以,我的问题是: 为什么我们仅限于这种(合法的)形式而不能使用另一种?
各位有什么想法吗?
附加 1:我也对为何“强制执行”此“规则”的设计决策感兴趣。
【问题讨论】:
-
@Nawaz 当我花了几分钟试图用错误的语法编译代码时,我想到了。经验教训:永远不要使用您不熟悉的功能。
-
这将恢复你的世界:三个 ... 也是声明符的一部分!
-
您也可以说“我的变量名的第一个字符的位置被限制在更接近基本类型的位置”。恕我直言,这是一件很奇怪的事情。
-
可能是因为声明符部分也可以使用包(函数或数组声明符)
标签: c++ c++11 variadic-templates