C++中的括号用于许多地方:例如,在函数调用和分组表达式中,以覆盖运算符优先级.除了非法的额外括号(例如函数调用参数列表周围)之外,C++的一般但非绝对规则是额外的括号永远不会受到伤害:
5.1主要表达式[expr.prim]
5.1.1一般[expr.prim.general]
6带括号的表达式是一个主表达式,其类型和值与所附表达式的类型和值相同.括号的存在不会影响表达式是否为左值.除非另有说明,否则带括号的表达式可以在与可以使用所包含的表达式的上下文完全相同的上下文中使用,并且具有相同的含义.
问题:在哪些上下文中,额外的括号会改变C++程序的含义,而不是覆盖基本的运算符优先级?
注意:我认为没有括号的指针到成员语法的限制&qualified-id超出了范围,因为它限制了语法而不是允许两个具有不同含义的语法.同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级.
显然,你不能void在格式良好的程序中有一个类型的实例,所以类似下面的声明就不会编译:
std::tuple<void, double, int> tup;
Run Code Online (Sandbox Code Playgroud)
但是,只要我们严格处理类型而不是对象,似乎没有问题.例如,我的编译器(GCC)让我说:
typedef std::tuple<void, double, int> tuple_type;
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意思,因为看起来使用C++ 0x我们可以用它std::tuple来执行许多早期需要boost::mpl库的元编程技巧.例如,我们可以使用std::tuple创建类型的向量.
例如,假设我们要创建表示函数签名的类型向量:
我们可以说:
template <class R, class... Args>
struct get_function_signature;
template <class R, class... Args>
struct get_function_signature<R(*)(Args...)>
{
typedef std::tuple<R, Args...> type;
};
Run Code Online (Sandbox Code Playgroud)
这似乎有效,即使函数签名具有void类型,只要我们从未实际实例化实例get_function_signature<F>::type.
但是,C++ 0x对我来说仍然是新手,当然所有实现仍然有点实验性,所以我对此有点不安.我们真的可以std::tuple用作元编程的类型向量吗?