我需要std::vector<Blah> v通过Blah的整数id 对自定义类型的向量进行排序.我这样做是因为std::sort(v.begin(), v.end())操作员<在内部过载Blah
bool operator< (const Blah& b) const { return (id < b.id); }
Run Code Online (Sandbox Code Playgroud)
我注意到Blah的私有id不能被声明为const int id,否则该类型Blah不符合要求std::sort(我认为它与不是ValueSwappable冲突?)
如果id不是const一切都很好.但是,我不喜欢对象没有常数id的想法只是为了在向量中重新排列它们的顺序.
有办法还是这样?
让我们看看以下代码:
int i = 10;
char c = reinterpret_cast<char&>(i);
Run Code Online (Sandbox Code Playgroud)
如果可以使用reinterpret_cast将"指向T1的指针"类型的表达式显式转换为"指向T2的指针"类型,则可以将类型T1的glvalue表达式强制转换为"对T2的引用".结果引用与源glvalue相同的对象,但具有指定的类型.
所以reinterpret_cast<char&>(i)具有指定char类型的左值引用该int对象i.
要进行初始化c,我们需要值,因此应用左值到右值的转换[conv.lval] /3.4:
glvalue指示的对象中包含的值是prvalue结果.
L2R转换的结果是i对象中包含的值.只要值i在char([expr]/4表示否则这是UB)可表示的范围内,变量c应初始化为具有相同的值.
从实现POV开始,在little-endian平台上,通过读取i对象地址处的字节可以轻松实现.但是,在big-endian平台上,编译器必须添加一个偏移量来获取最低有效字节.或者,将整个int对象读入寄存器并屏蔽第一个字节,这对两个端点都是可接受的方法.
如果您认为编译器可以轻松处理上面的代码以生成符合C++ 17标准所要求的代码,那么可以考虑将指针int指向指向i的指针char.这样的转换不会改变指针值,即它仍然指向int对象i,这意味着将间接运算符应用于具有以下L2R转换的指针应该如上所述,即int如果是,则获取对象的值按char类型表示.
在以下代码中
int i = 10;
f(reinterpret_cast<char*>(&i)); // void f(char*)
Run Code Online (Sandbox Code Playgroud)
如果编译器i不知道函数f将对其参数做什么,那么编译器是否应该调整某个偏移的地址?并且编译器也不知道将传递给函数的内容f.上面的代码和函数f在不同的翻译单元中.
例如,如果f …
编辑:原始的单词选择令人困惑.术语"象征性"比原始术语("神秘")要好得多.
在关于我以前的C++问题的讨论中,我被告知指针是
这并没有健全的权利!如果没有任何符号,并且指针是其表示,那么我可以执行以下操作.我可以吗?
#include <stdio.h>
#include <string.h>
int main() {
int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
printf ("pa1 == pb\n");
*pa1 = 2;
}
else {
printf ("pa1 != pb\n");
pa1 = &a[0]; // ensure well defined behaviour in printf
}
printf ("b = %d *pa1 = %d\n", …Run Code Online (Sandbox Code Playgroud) 这是我在"我不理解C和C++中的指针"集合中的一个新问题.
如果我将具有相同值的两个指针的位混合(指向相同的存储器地址),那恰好具有完全相同的位表示,当一个是可解除引用且一个是结束时,标准说应该发生什么?
#include <stdio.h>
#include <string.h>
#include <assert.h>
// required: a == b
// returns a copy of both a and b into dest
// (half of the bytes of either pointers)
int *copy2to1 (int *a, int *b) {
// check input:
// not only the pointers must be equal
assert (a == b);
// also the representation must match exactly
int *dest;
size_t s = sizeof(dest);
assert(memcmp(&a, &b, s) == 0);
// copy a and b into dest:
// …Run Code Online (Sandbox Code Playgroud) 简介:这个问题是我收集的C和C++(以及C/C++常见子集)问题的一部分,这些问题涉及允许具有严格相同的字节表示的指针对象具有不同的"值",即行为不同对于某些操作(包括在一个对象上定义了行为,在另一个对象上定义了未定义的行为).
在另一个引起很多混淆的问题之后,这里有关于指针语义的问题,希望能够解决问题:
这个程序在所有情况下都有效吗?唯一有趣的部分是在"pa1 == pb"分支中.
#include <stdio.h>
#include <string.h>
int main() {
int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
int *p;
printf ("pa1 == pb\n"); // interesting part
memcpy (&p, &pa1, sizeof p); // make a copy of the representation
memcpy (&pa1, &p, sizeof p); // pa1 is a copy of the bytes of …Run Code Online (Sandbox Code Playgroud)