大多数令人烦恼的解析,并访问阵列
Most vexing parse with array access
在查看一些C 03代码时,我找到了一个最烦人的parse parse 的实例,使我感到困惑:
#include <sstream>
#include <string>
int main(int, char** argv)
{
std::stringstream ss(std::string(argv[0]));
}
wandbox上的实时示例
在上面的摘要中, ss
是对 std::string*
并返回 std::stringstream
的函数的声明。
如何将std::string(argv[0])
解析为std::string*
?
直觉上,我认为argv[0]
是明确的访问argv
。
原因是因为在函数声明的上下文中,编译器将std::string(argv[0])
解释为std::string argv[0]
,即零尺寸数组的A em 声明参数命名 argv
(从 main
中遮盖了 argv
,因为这是一个不同的范围),然后与 array to-pointer-decay-decay 。。。。P>
因此,std::stringstream ss(std::string(argv[0]));
表示与std::stringstream ss(std::string* argv);
编辑:由于在评论中正确注明了它,因此零尺寸的数组声明在C 中无效,使该程序不正确。在使用-pedantic
标志(GCC和Clang)编译此代码时,将发出警告。Visual Studio甚至会产生汇编误差。对于任何其他数组索引,上面的论点仍然存在。
我相信,这是从"声明语法"中的,就像表达语法"原理",而"数组"参数是指示符。
以下数组声明是等效的:
int x[1];
int (x)[1];
int (x[1]);
或多或少是因为x[a]
,(x)[a]
和(x[a])
是等效的表达式。
因此,
std::stringstream ss(std::string(argv[0]))
<=>
std::stringstream ss(std::string argv[0])
<=>
std::stringstream ss(std::string* argv)
相关文章:
- 回旋/修改阵列访问
- 访问特定阵列位置/索引时出现分段错误
- 如何将1D阵列访问为2D阵列
- 分配/访问2d阵列,使得2d子块是连续的
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 访问多个阵列时 CPU 缓存的作用是什么?
- OpenMP 环路阵列访问中的错误共享
- 访问字符阵列中不可用的内存位置(超出范围值)
- 将std ::向量转换为阵列和当时的p/调用它会导致访问违规例外,在编组期间mscorlib.dll
- C 使用坐标结构的访问阵列元素
- 大多数令人烦恼的解析,并访问阵列
- C 私有阵列访问和存储
- 是二维阵列访问/修改时间组
- 阵列访问期间出现分段错误
- X86 MASM-通过并访问2D阵列
- 动态2D阵列访问侵犯剩余
- 为什么2D数组访问要比1D阵列访问更快
- 在循环的停止条件下访问阵列值是安全的吗?
- 快速访问阵列中的数据
- 尝试访问阵列的隔离错误