使用额外括号时的"error: expected expression"
"error: expected expression" when using extra parentheses
我刚刚无意中发现了一个编译器错误:
std::cout << sizeof(int) << std::endl; // ---> this is valid (obviously)
std::cout << sizeof((int)) << std::endl; // ---> this leads to
// "error: expected expression"
同样,我们有:
template <typename T>
struct Foo
{
T value;
};
Foo<int> f1; // ---> this is valid (obviously)
Foo<(int)> f2; // ---> this leads to "error: expected expression"
显然,编译器将(T)
解释为显式转换,并就此停止。我理解这个错误,我理解编译器的期望,我不明白的是,如果(T)
不在(T)(exp)
的上下文中,为什么它不能被视为T
。我认为编译器能够看穿这一点(并可能返回警告),所以我认为这意味着在某些不明确的情况下,允许这些额外的括号会导致错误。
我的问题是:什么时候会有危险?这在C++标准中吗?
这是用clang 3.3测试的。和g++4.7.2。
sizeof
需要值(表达式)或类型。(int)
既不是其中之一,也不能将类型视为值,并期望它们在期望值这样做的情况下正确操作,因为它们不是(一流)值。因此,你不能只在一个类型中加上括号,然后出现相同的类型。
相关文章:
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 为什么我会"error: expected expression"?
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- NDK 构建中的异常"error: expected ';' after top level declarator"
- 为什么我总是"error: expected unqualified-id before 'case'"?
- "[Error] expected unqualified-Id before 'if'"这个代码块是什么意思
- 推导模板类重载方法的地址会导致"error: expected primary-expression before ‘decltype’"
- 使用宏访问指向数据成员的指针会导致"error: expected unqualified-id before ‘*’ token"
- "error: expected primary-expression before '<=' token" 我做错了什么?
- 内存集调用位置的"error: expected constructor, destructor, or type conversion before '(' token"
- 模板成员函数调用 -- "error: expected primary-expression before 'int'"
- "Error: expected a '{' introducing a lambda body"尝试从地图<字符,字符中获取字符时> C++
- 运算符 [] 重载的"error: expected unqualified-id before 'float' "
- 设置if流,获取'error: expected initializer before ‘.’ token'
- 我的代码看起来不错。为什么我要得到"error: expected primary-expression before ')' token"?
- C++ "Error expected a ')'"
- C++错误"tabulate.cc:19: error: expected primary-expression before ',' token"
- "Error: expected a declaration" 在 Apache Hadoop源代码中使用 Visual Studio 2010
- C++:"error: expected ',' or '...' before '(' token"