내 작은 테스트에 따르면이 코드가 작동합니다. 그러나 그것은 정의되지 않은 행동을합니까? const_cast를 사용하여 const 개체를 수정하면 이전 테스트에서 런타임 액세스 위반이 발생했지만 어떻게 다른지 기억할 수 없습니다. 근본적으로 무언가 잘못 되었나요? 아닙니다.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)를 주목 스택에 맞게 너무 많이.)
편집 : I 실제로 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' 문은 안전하게 생략 할 수 있습니다. –