【发布时间】:2015-06-22 21:52:53
【问题描述】:
例如这样的声明:
int (x) = 0;
甚至:
int (((x))) = 0;
我偶然发现了这一点,因为在我的代码中我碰巧有一个类似于以下的片段:
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
显然我想构造对象C,然后它会在其析构函数中做一些有用的事情。然而,编译器将C (y); 视为y 类型为C 的变量的声明,因此它会打印有关y 重定义的错误。有趣的是,如果我将它写为C (y).f () 或C (static_cast<B*> (y)) 之类的东西,它将按预期编译。当然,最好的现代解决方法是在构造函数调用中使用{}。
所以我后来发现,可以声明像 int (x) = 0; 甚至 int (((x))) = 0; 这样的变量,但我从未见过有人真正使用过这样的声明。所以我很感兴趣——这种可能性的目的是什么,因为现在我看到它只会创建类似于臭名昭著的“最令人烦恼的解析”的案例,并且没有添加任何有用的东西?
【问题讨论】:
-
这种可能性的“目的”大概是为了简化解析器。
-
@GSerg 有趣的是,我的问题文本如何回答链接问题中第二个答案的问题,因为我提供了允许此类声明导致意外结果的示例:)
-
走进了这个陷阱:不知道互斥量被注释掉了,然后不小心写了不正确的括号声明。 //std::mutex std::unique_lock<:mutex>(m_mutex);
标签: c++ most-vexing-parse