문제

나는 Collegue의 코드를 검토하고 있으며, 그가 글로벌 범위에 다음과 같이 정의 된 몇 가지 상수를 가지고 있음을 알 수 있습니다.

const string& SomeConstant = "This is some constant text";

개인적으로, 이것은 내가 가정하는 것을 언급하는 것이 주어진 숯 배열로 구성된 "익명"객체라고 언급하기 때문에 나에게 나쁜 냄새가납니다.

구문 적으로, 그것은 합법적이며 (적어도 VC ++ 7에서) 실행되는 것처럼 보이지만 실제로는 그를 제거하고, 그것이 무엇을하고 있는지에 대한 모호성이 없습니다.

그래서 이것은 정말로 안전하고 합법적이며 집착하고 있습니까? 구성중인 임시 물체의 수명이 보장됩니까? 나는 항상 이런 식으로 사용 된 익명의 물체가 사용 후 파괴되었다고 가정했다.


따라서 내 질문은 익명의 객체 수명으로 일반화 될 수 있습니다. 표준은 익명의 대상의 수명을 지시합니까? 같은 범위의 다른 물체와 같은 수명이 있습니까? 아니면 표현의 수명 만 주어 졌습니까?


또한 현지인으로 할 때 분명히 다르게 범위를 지정합니다.

class A
{
    string _str;

public:
    A(const string& str) :
        _str(str)
    {
        cout << "Constructing A(" << _str << ")" << endl;
    }

    ~A()
    {
        cout << "Destructing A(" << _str << ")" << endl;
    }
};

void TestFun()
{
    A("Outer");
    cout << "Hi" << endl;
}

쇼 :

(외부) 구성; (외부) 파괴; 안녕

도움이 되었습니까?

해결책

완전히 합법적입니다. 프로그램이 끝날 때까지 파괴되지 않습니다.

편집하다: , 보장됩니다 :

"동적 스토리지 지속 시간이없는 모든 객체는 스레드 저장 시간이 없으며 로컬에 있지 않은 정적 저장 시간이 있습니다. 이러한 객체의 스토리지는 프로그램 지속 시간 동안 지속되어야합니다 (3.6.2, 3.6.3). "

-- 2008 작업 초안, 프로그래밍 언어 표준 C ++, § 3.7.1 p. 63

마틴이 지적했듯이, 이것은 전체 대답이 아닙니다. 표준 초안 추가 참고 사항 (§ 12.2, p. 250-1) :

"클래스 유형의 임시는 다양한 맥락에서 생성됩니다. rvalue를 참조 (8.5.3)에 바인딩하는 (8.5.3) [...] 임시 물체의 생성이 피할 때에도 (12.8), 모든 의미 제한은 마치 마치 존중됩니다. 임시 객체가 만들어졌습니다. [...] 임시 객체는 (어휘)가 생성 된 지점을 포함하는 전체 발현 (1.9)을 평가하는 마지막 단계로 파괴됩니다. [...] 두 가지 문맥이 있습니다. 임시는 최대 표현의 끝보다 다른 지점에서 파괴된다. [...] 두 번째 컨텍스트는 기준이 임시에 묶여있을 때이다. 기준이 바인딩되는 하위 목체의 완전한 객체 아래에 지정된 경우를 제외하고 참조의 수명 동안 지속됩니다. "

그것이 당신이 기분이 나아지는 경우 G ++에서 테스트했습니다. ;)

다른 팁

예, 유효하고 합법적입니다.

const string& SomeConstant = "This is some constant text";

// Is equivalent too:

const string& SomeConstant = std::string("This is some constant text");

따라서 임시 객체를 만들고 있습니다.
이 임시 객체는 const에 묶여 있으므로 변수의 수명까지 수명이 연장되어야합니다 (즉, 생성 된 표현보다 길다).

이것은 표준에 의해 guranteed입니다.

메모:

합법적이지만. 나는 그것을 사용하지 않을 것입니다. Easist 솔루션은 Const STD :: 문자열로 변환하는 것입니다.

용법:

이 상황에서 변수는 글로벌 범위이기 때문에 프로그램의 전체 길이에 유효합니다. 따라서 실행이 main ()에 들어가 자마자 사용할 수 있으며 executiuon 종료 main () 후에 액세스하지 않아야합니다.

글로벌 변수 초기화 순서의 알려진 문제로 인해 글로벌 객체의 생성자/파괴자에서 IT를 사용하기 전에 기술적으로 불가능할 수 있습니다.

추가 생각 :

반면에 이것은 문제로 고통받지 않을 것입니다.

char const* SomeConstant = "This is some constant text";

언제라도 사용할 수 있습니다. 그냥 생각.

합법적이지만 여전히 못 생겼을 수도 있습니다. 참조를 남기십시오!

const string SomeConstant = "This is some constant text";

추악한 것만 큼 합법적입니다.

임시 변수를 const 참조, 이것은 Alexandrescu 's에서 사용합니다 SCOPEGAURD Herb Sutter 의이 훌륭한 설명을 참조하십시오 "가장 중요한 후보 const".

즉,이 특정 사례는 C ++ 의이 특징을 남용하고 참조는 평원을 떠나야합니다. const string.

그것을 const로 선언함으로써 (그것은 변경할 수 없다는 것을 의미합니다), 그것을 참조 할 수 있다는 것을 의미합니다. 즉, 누군가가 그것을 바꿀 수 있다는 것을 의미합니다. 최소한 나쁜 형태처럼 보입니다. 또한, 당신이 이해하는 것처럼, 글로벌 변수는 나쁘고 거의 필요하지 않습니다.

좋아, 내가 깊이 끝나면 사람들은 나를 교정하지만, 여기에 당신의 훌륭한 응답을 듣는 내 결론은 다음과 같습니다.

a) 그것은 구문 적으로 논리적으로 합법적이며, 표현 수준을 넘어서 기준 수명의 수명을 참조 수명으로 확장합니다. VC ++ 7에서 다음과 같이 확인했습니다.

class A { 
    public: A() { cout << "constructing A" << endl; }
    public: ~A() { cout << "destructing A" << endl; }
};

void Foo()
{
    A();
    cout << "Foo" << endl;
}

void Bar()
{
    const A& someA = A();
    cout << "Bar" << endl;
}

int main()
{
    Foo();    // outputs constructing A, destructing A, Foo
    Bar();    // outputs constructing A, Bar, destructing A
    return 0;
}

b) 합법적이지만 실제 수명에 대해 약간의 혼란을 초래할 수 있으며 이러한 경우 참조는이를 비 참조로 선언 할 수있는 이점을 제공하지 않으므로 참조를 피해야하며 추가 공간 일 수도 있습니다. . 이점이 없기 때문에 불필요한 난독 화입니다.

모든 답변에 감사드립니다. 그것은 매우 흥미로운 Dicussion이었습니다. 따라서 길고 짧은 점 : 예, 구문 적으로 합법적이며 평생 연장되어 기술적으로 위험하지는 않지만 아무것도 추가하지 않고 비용과 혼란을 더할 수 있으므로 왜 귀찮게 하는가.

소리가 맞아?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top