根据我的小测试,这段代码是可以工作的。但是,它是否具有未定义行为?通过使用const_cast修改const对象导致了我之前测试中的运行时访问冲突,但我不记得它们有什么不同了。所以,这里基本上有什么问题还是没有问题?
// test.h
#pragma once
#include <boost/array.hpp>
typedef boost::array<int,100000> bigLut_t;
extern const bigLut_t constBigLut;
// test.cpp
#include "test.h"
bigLut_t& initializeConstBigLut()
{
bigLut_t* pBigLut = const_cast<bigLut_t*>( &constBigLut );
for(int i = 0; i < 100000; ++i) {
pBigLut->at(i) = i;
}
return const_cast<bigLut_t&>(constBigLut);
}
const bigLut_t constBigLut = initializeConstBigLut();
// const_test.cpp
#include <iostream>
#include "test.h"
void main()
{
for(int i = 0; i < 100; ++i) {
std::cout << constBigLut[i] << std::endl;
}
system("pause");
}
(请注意,sizeof(bigLut_t)太大而无法适合堆栈。)
编辑: 实际上,我最喜欢ybungalobill的小注释中的想法来初始化这些大对象:
// test.h
#pragma once
#include <boost/array.hpp>
extern const struct BigLut : public boost::array<int,100000> {
BigLut();
} constBigLut;
// test.cpp
#include "test.h"
const BigLut constBigLut;
BigLut::BigLut()
{
for(int i = 0; i < 100000; ++i) {
this->at(i) = i;
}
}
void main
是非法的。main
函数必须始终具有返回类型int
。尽管如此,您可以安全地省略return
语句。 - Konrad Rudolph