当我需要一个指向类成员的指针时,我会这样做
struct MyStruct
{
int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么我需要使用&运算符来获取可能被忽略的地址(如果它是静态函数).另外,我听说指向成员的指针实际上并不是指针,有人可以澄清一下吗?
我有一个例子:
int i = 1;
const int *b = &i;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不明白的是,当地址i转换为指向const int的指针时.i在资格转换中是否将转换为const整数?在应用资格转换时,引擎盖下到底发生了什么?
(5.2.10/6)C++ 03指向函数的指针可以显式转换为指向不同类型函数的指针.通过指向函数类型(8.3.5)的函数调用函数的效果是未定义的,该函数类型与函数定义中使用的类型不同.除了将"指向T1的指针"的rvalue转换为"指向T2的指针"类型(其中T1和T2是函数类型)并返回其原始类型产生原始指针值之外,这种指针转换的结果未指定.[注意:有关指针转换的更多详细信息,另请参见4.10.]
以下是我正在尝试做的事情,虽然很明显转换fp1为的结果fp2将产生一个原始指针,但在同一点上标准中的措辞是"The result of such a pointer conversion is unspecified"什么意思呢?
int f() { return 42; }
int main()
{
void(*fp1)() = reinterpret_cast<void(*)()>(f);
int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
// Safe to call the function ?
fp2();
}
Run Code Online (Sandbox Code Playgroud) 关于标准中哪条规则的任何想法都说明了这样的陈述:
p++; //where 'p' is pointer to array
Run Code Online (Sandbox Code Playgroud)
不能出现在全球范围内?
如果可能的话,我正在寻找一个参考,而不只是一个解释.
以下是否调用未定义的行为?
int x;
int i = x;
Run Code Online (Sandbox Code Playgroud)
参考C++ 03
(4.1/1)如果左值引用的对象不是类型T的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为.
编辑: 但是,从(3.3.1/1)开始,对象可能会使用自己的不确定值进行初始化,为什么会这样?即
int x = x; //not an undefined behaviour
Run Code Online (Sandbox Code Playgroud) 在下面的例子中,当我传递p给一个函数时,它会在函数func退出后立即被销毁
void func(std::auto_ptr<int> p)
{
// deletes p
}
int main()
{
std::auto_ptr<int> p(new int);
func(p);
*p = 1; // run-time error
}
Run Code Online (Sandbox Code Playgroud)
我还被告知,通过引用传递智能指针是"The C++ Standard Library - Nicolai M. Josuttis的参考"一书中非常糟糕的设计.
引用:
允许auto_ptr通过引用传递是非常糟糕的设计,你应该总是避免它.....
..... 根据auto_ptrs的概念,可以通过使用常量引用将所有权转移到函数中.
是不是可以通过智能指针或我有错误的想法?
假设short是2个字节,并且int在32位OS上是4个字节.以下是未定义的行为吗?
short s = 42;
int *p = (int*)(&s);
Run Code Online (Sandbox Code Playgroud)