为什么使用构造函数调用表示法定义指向指针变量的指针是非法的
Why is it illegal to define a pointer to pointer variable with constructor invocation notation?
当我使用构造函数调用表示法(declare-)定义指向指针的指针(而不是赋值表示法 - 当然,这将在运行时做同样的事情;这只是一个约定),我得到一个编译器错误。我想知道为什么会这样。
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 - 无效令牌,这并没有说明很多。但是,&
不是问题(这意味着它可能不是运算符优先级错误)。如果我执行以下操作:
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++。而且,正如其他人指出的那样,海湾合作委员会确实接受它。根据您得到的编译器错误,它看起来像MSVC解析器中的错误。
事实上,添加括号有助于它正确解析代码:
Foo* parFoo = new Foo[2];
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too
在VS2005中,代码可以简化为仅
int main() {
int** ppFoo(0);
}
它会产生相同的错误。显然,这是编译器中的一个错误。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 使用指针向量到参考向量是非法的吗?
- 指向引用的指针是非法的
- 为什么是非法的:将指针向量复制到指向常量的指针向量中
- 为什么使用构造函数调用表示法定义指向指针变量的指针是非法的
- 有什么方法可以避免在C++中使用非法指针吗
- 指向未指定大小的数组的指针在C++"(*p)[]"非法,但在 C 语言中是合法的
- C++ 非法间接寻址数组和指针
- 错误C2823:typedef模板是非法的-函数指针
- 将const int赋值给指向int的const指针是非法的
- 指向非法引用的成员的指针
- 从ROOT(cern)使用AddFriend时出现"非法指针"错误
- 为什么const指针中的结构操作是非法的
- 为什么指向未定义结构的指针在C和c++中有时是非法的