Selon mes petits tests ce code fonctionne. Mais, a-t-il un comportement indéfini? La modification de l'objet const à l'aide de const_cast a entraîné des violations d'accès au moment de l'exécution lors de mes tests précédents, mais je ne me rappelle plus en quoi elles étaient différentes. Donc, y a-t-il fondamentalement quelque chose de mal ici ou pas?Cette initialisation const via const_cast a-t-elle un comportement indéfini?
// 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");
}
(Notez que sizeof (bigLut_t) est trop pour entrer dans la pile.)
EDIT: fait je aime l'idée dans les années ybungalobill petit commentaire le mieux pour une méthode d'initialisation de ces gros objets:
// 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;
}
}
En dehors du reste, 'main' vide est illégale en C++. 'main' doit toujours avoir le type de retour' int'. Vous pouvez cependant omettre l'instruction 'return' en toute sécurité. –