c++ - 为什么用构造函数调用符号定义指向指针变量的指针是非法的?

标签 c++

当我使用构造函数调用符号(声明-)定义指向指针的指针(而不是赋值符号——当然这会在运行时做同样的事情;这只是一个约定),我得到一个编译器错误。我想知道这是为什么。

struct  Foo 
{ /* ... */ };

int main(int argc, char** argv)
{
  Foo*  parFoo = new Foo[2];
  Foo** ppFoo(&parFoo); // invalid: C2059
  Foo** ppFoo = &parFoo; // OK

  delete[] parFoo;
}

错误是 C2059 - 无效 token ,这并没有说明太多。但是,& 不是问题所在(这意味着它可能不是运算符优先级错误)。如果我执行以下操作:

int main(int argc, char** argv)
{
  Foo*  parFoo = new Foo[2];
  Foo** ppFoo = &parFoo; // OK
  Foo** ppFoo2(ppFoo); // invalid: C2061

  delete[] parFoo;
}

...然后我得到一个 C2061,这意味着这次它是位于错误位置的 ppFoo 标识符。

什么句法规则导致了这种情况,即为什么构造函数调用符号不能用于定义指向指针的指针,只能定义“较少程度指向”类型?

最佳答案

它看起来像有效的 C++。而且,正如其他人指出的那样,GCC 确实接受了它。根据您得到的编译器错误,它看起来像是 MSVC 解析器中的错误。

事实上,添加括号有助于它正确解析代码:

Foo*  parFoo = new Foo[2];
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too

关于c++ - 为什么用构造函数调用符号定义指向指针变量的指针是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13807168/

相关文章:

c++ - 为什么 wxDC::GetTextExtent() 对于 wxWidgets 中的高 DPI 显示返回相同的值?

c++ - 仅 header 库中的静态 constexpr 成员初始化

c++ - constexpr-if-else 主体能否在 constexpr auto 函数中返回不同类型?

c++ - 为什么 Visual Studio 在没有优化的情况下可以正确编译此函数,但在优化时却编译错误?

c++ - 当 unary_function 使用引用参数时使用 std::not1 编译时出错

c++ - 如何将新的 Qt 窗口与现有的 X 应用程序集成?

c++ - 为什么在使用模板递归检查数字是否为 3 的幂时需要特殊情况?

c++ - 检测 C++ lambda 是否可以转换为函数指针

c++ - C++运行时是什么意思?

c++ - 我应该如何使用所有不同的链表格式化命名空间?