- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
this[5]
有什么作用?我是否调用了某种未定义的行为?关于:
std::vector<decltype(this)> foo{this, this + 5u};
这个有用吗?我想知道指针算法对 this
的影响是什么。这是一个测试程序:
#include <iostream>
#include <vector>
struct Foo
{
int n = 1;
void foo()
{
std::vector<decltype(this)> foo{this, this + 5u};
for (decltype(foo.size()) i = 0; i != foo.size(); ++i)
{
std::cout << foo[i]->n << "\n";
}
}
};
int main()
{
Foo{}.foo();
}
/* OUTPUT:
* 1
* 0
*/
最佳答案
首先,您需要记住,指针下标本质上是一种语法糖,旨在简化对数组的操作。相反,它通过对指向此类数组元素的指针执行算术运算来实现这一点。
因此,给定 int array[3]
和一个指针 int* ptr = &array[0]
,ptr[2]
是指向 array
的第三个元素的指针。
出于完全相同的原因,并且由于数组的名称如何衰减为指针,array[2]
是指向 array
的第三个元素的指针。
您甚至可以更改“起点”:给定 int* ptr = &array[1]
,ptr[1]
也是指向第 3 个元素的指针array
,因为您本质上是在编写 (array+1+1)
。
没有理由不能将相同的逻辑应用于名为 this
的指针。但是,如果且仅当对象被分配为数组的一部分,并且您不会尝试超出该数组的范围进行读取,那么它是明确定义的。
这是一个例子:
#include <iostream>
struct T
{
int x;
T(int x) : x(x) {};
void bar() { std::cout << x << std::endl; }
void foo() { this[1].bar(); } // or (this+1).bar()
};
int main()
{
T array[4] = { T(0), T(1), T(2), T(3) };
array[0].foo(); // OK, outputs 1
array[1].foo(); // OK, outputs 2
array[2].foo(); // OK, outputs 3
array[3].foo(); // undefined; `this[1]` is the same as `array[4]`, so
// evaluating that pointer has UB, never mind invoking
// bar() through it and printing a member variable!
}
这里是相关的标准措辞:
[C++11: 5.2.1/2]:
A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “pointer toT
” and the other shall have unscoped enumeration or integral type. The result is an lvalue of type “T
.” The type “T
” shall be a completely-defined object type. The expressionE1[E2]
is identical (by definition) to*((E1)+(E2))
[ Note: see 5.3 and 5.7 for details of*
and+
and 8.3.4 for details of arrays. —end note ]
[C++11: 5.7/5]:
When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integral expression. [..]
关于c++ - 下标 this 指针的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920949/
是否可以创建一个可以使用显式参数标签调用的下标? struct MyType { subscript (label: Bool) -> String? { return nil
我正在尝试制作一个包含带有上标和/或下标的文本的超链接。我找到了两种方法来做到这一点,它们都很糟糕。 解决方案#1:使用 Typography.Variants .这为某些字体提供了极好的上标……。
在这里! 我想在 geom_bracket 中包含一个带下标的标签在 ggplot2 .我尝试了不同的方式,但没有人成功(评论中的尝试): library(ggplot2) ggplot(data =
我正在尝试让 graphviz 启动并工作,我迫切需要节点标签中的下标。不幸的是,通过浏览无数关于类似问题的帖子,我似乎适合所有建议的解决方案,但仍然不起作用。这是我的代码: digraph G{
抱歉格式问题,我从来没有真正在这样的论坛上发帖,所以我必须学习一下操作方法。 我的问题是:我正在编写一个模板类,我想通过多种 [] 运算符访问我的容器。我读了一些关于这个主题的内容,所以我已经能够重载
我知道我们可以像在 matplotlib 中生成单个下标 $r_i$ 会给我一个下标为“i”的r。 但我想生成一个包含 3 或 4 个字母的下标,例如 r_ijk 应该给我一个带有“ijk”作为下标的
this[5] 有什么作用?我是否调用了某种未定义的行为?关于: std::vector foo{this, this + 5u}; 这个有用吗?我想知道指针算法对 this 的影响是什么。这是一个测
我从 visual studio 得到了一些奇怪的行为,关于以下代码片段,错误列表显示了 E0349 的几个实例:没有运算符“[]”匹配这些操作数。 Intellisense 似乎暗示类型不匹配,但正
我想为我的数组类提供 PHP 样式的 push_back 功能: arrayT arr; arr[] = 10; // == std::vector::push_back() 和 arrayT::op
下标 (subscripts)可以定义在类(class)、结构体(structure)和枚举(enumeration)中,是访问集合(collection),列表(list)或序列(sequence)
我正在使用traindata训练svm。 (R中的e1071软件包)。以下是有关我的数据的信息。 > str(train) 'data.frame': 891 obs. of 10 variab
#include int main(){ int arr[7] = {0,1,2,3,4,3,2}; arr[0]++[arr]++[arr]++[arr]++[arr]++[arr]
如果我想以特定用户的身份调用主脚本文件中的另一个 shell 脚本,我该怎么做呢?子脚本似乎失去了它正在运行的用户的上下文,我还没有找到任何有用的子脚本技术。 例如:war-install.sh if
这个问题在这里已经有了答案: Why isn't there an operator[] for a std::list? (4 个答案) 关闭 5 年前。 我有这些类型定义: typedef pa
我在 NSUserdefaults 中获取字典的字符串时遇到问题,这是我的代码。我不知道似乎是什么问题: static func getItemInUserDefaultsDictionary(key
我正在尝试执行以下代码并收到错误 Could not find member 'subscript on Xcode6 var b:[[Float]] = [[1,2]] var i2 = 0 //
我尝试运行的代码: std::string genBlankName(std::vector &posts) { std::string baseName = "New Post ";
1 1 A_{3} 2 2 C_{2} 3 3 ^{5}C_{1} 我有一个这样的输入文件要绘制。第三列是该点上的标签( latex 格式)。我如何在绘图上显示这些标签,就像它们在 latex 编译后
我在这里搜索了一段时间,之前的问题/答案部分回答了我的问题。我正在学习 R,来自 Matlab。正如标题所说,我有一个关于情节注释的问题。在 Matlab 中,绘制包含各种数据格式的注释非常简单,我正
我想将一些化学数据放入表格的列中。但在现有表格中,下标显示为普通字符。其中一些显示为问号。我应该怎么做才能解决它? 当我输入这段代码时 SELECT N'H' + NCHAR(0x2082) + N
我是一名优秀的程序员,十分优秀!