根据我的理解,以下代码是根据c ++标准的未定义行为(特别是第7.1.5.1.4节[dcl.type.cv]/4).
#include <iostream>
struct F;
F* g;
struct F {
F() : val(5)
{
g = this;
}
int val;
};
const F f;
int main() {
g->val = 8;
std::cout << f.val << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,这打印'8'与我尝试过的每个编译器和优化设置.
问题:是否存在使用此类"隐式const_cast"显示意外结果的示例?
我希望有一些像结果一样壮观的东西
#include <iostream>
int main() {
for (int i = 0; i <=4; ++i)
std::cout << i * 1000000000 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
例如,gcc 4.8.5 with -O2
编辑:标准的相关部分
7.1.5.1.4:除了可以修改声明为mutable(7.1.1)的任何类成员之外,任何在其生命周期内修改const对象的尝试(3.8)都会导致未定义的行为.
在回复提出重复的评论; 它不是重复的,因为我要求一个"意外"结果发生的例子.
我有一个c-extension在静态初始化期间加载环境变量.我需要能够更改这些值并重新加载模块(我无法更改它们是静态加载的事实).我试着设置os.environ,但似乎没有成为一个env在选择importlib像subprocess.call
这是一个例子:假设我有一个如下定义的模块
#include <boost/python.hpp>
#include <cstdlib>
#include <string>
std::string get() {
return ::getenv("HOME");
}
BOOST_PYTHON_MODULE(sample) {
boost::python::def("get", &get);
}
Run Code Online (Sandbox Code Playgroud)
我有python代码:
import importlib, os
import sample as s
print(s.get()) # prints /home/username
# do something like
# os.environ['HOME'] = 'foo'
importlib.reload(s)
print(s.get()) # I would like this to print 'foo'
Run Code Online (Sandbox Code Playgroud)
换句话说,我可以做什么而不是os.environ['HOME'] = 'foo'导致环境变量在c模块中改变?
注意:我无法使用,setenv因为变量是静态加载的,我无法重新初始化所有依赖于它们的东西.