В соответствии с моими небольшими тестами этот код работает. Но имеет ли это неопределенное поведение? Изменение const-объекта с использованием const_cast привело к нарушениям во время выполнения во время предыдущих тестов, но я не помню, как они были разными. Итак, есть ли в принципе что-то неправильно или нет?Имеет ли эта инициализация const через const_cast неопределенное поведение?
// 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) слишком много, чтобы поместиться в стек.)
EDIT: Я на самом деле нравится идея в 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;
}
}
Помимо остального, `недействительным main` является незаконным в C++. `main` должен ** всегда ** иметь тип возврата` int`. Однако вы можете спокойно опустить оператор `return`. – 2010-11-27 12:15:05