最近尝试了以下程序,它编译,运行正常并产生预期的输出,而不是任何运行时错误.
#include <iostream>
class demo
{
public:
static void fun()
{
std::cout<<"fun() is called\n";
}
static int a;
};
int demo::a=9;
int main()
{
demo* d=nullptr;
d->fun();
std::cout<<d->a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果未初始化的指针用于访问类和/或结构成员,则行为未定义,但为什么允许使用空指针访问静态成员.我的计划有什么危害吗?
class Foo {
public:
static const int kType = 42;
};
void Func() {
Foo *bar = NULL;
int x = bar->kType;
putc(x, stderr);
}
Run Code Online (Sandbox Code Playgroud)
这是定义的行为吗?我阅读了C++标准但是找不到任何关于访问静态const值的内容......我已经检查了GCC 4.2,Clang ++和Visual Studio 2010生成的程序集,并且它们都没有执行NULL的解引用指针,但我想确定.
后缀表达式后跟一个点.或箭头->,可选地后跟关键字template(17.2),然后是id-expression,后缀表达式.评估点或箭头之前的后缀表达式; 67该评估的结果与id-expression一起确定整个后缀表达式的结果.
67)如果计算了类成员访问表达式,则即使不需要结果来确定整个后缀表达式的值,也会发生子表达式求值,例如,如果id-expression表示静态成员.
我有一个包含多个类的程序,其中一些需要随机双精度和整数。在其中一个类中,我定义了一个结构来为随机引擎提供种子,并且能够在需要时通过该结构的对象生成随机实数和整数。带有类和结构声明的 .hpp 文件如下所示:
struct RNG {
public:
static std::mt19937 gen;
static std::uniform_int_distribution<uint32_t> dist_ui;
static std::uniform_real_distribution<double> dist_d;
uint32_t r_ui = dist_ui(gen);
double r_d = dist_d(gen);
private:
static unsigned seed;
};
class A {
private:
uint32_t a_;
public:
A();
};
Run Code Online (Sandbox Code Playgroud)
.cpp 文件如下所示:
#include "A.hpp"
unsigned RNG::seed = 42;
std::mt19937 RNG::gen(RNG::seed);
std::uniform_int_distribution<uint32_t> RNG::dist_ui(1, std::numeric_limits<uint32_t>::max());
std::uniform_real_distribution<double> RNG::dist_d(0.0,1.0);
A::A() {
RNG* r;
a_ = r->dist_ui(r->gen);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我调用uniform_real_distribution
r->dist_d(r->gen)
Run Code Online (Sandbox Code Playgroud)
一切正常。但是,如果我调用uniform_int_distribution
r->dist_ui(r->gen)
Run Code Online (Sandbox Code Playgroud)
与上面的代码片段一样,我遇到了分段错误。如果我仅使用 int dist 而不是 real 和 int 来定义结构,或者将 int dist 的边界更改为 [0,100) 或其他任何内容,也会发生错误。有谁知道这里发生了什么?我感谢任何帮助!
编辑:如果我像这样访问非静态成员,我会得到同样的错误
RNG …Run Code Online (Sandbox Code Playgroud)