C ++ : 유형 지정자 전후 대 const 참조


144

다음과 같은 주장의 차이점은 무엇입니까?

int foo1(const Fred &arg) {
...
}

int foo2(Fred const &arg) {
...
}

? 이 사례는 초고속 FAQ에서 다루지 않습니다.



2
이것이 스타일에 대한 질문입니까? "const Fred"는 영어로 들리지만 "Fred const"는 더 나아 보입니다.
LatinSuD

1
관련 메모에서 선호해야 할 이유 Fred const &argFred const& arg있습니까? 나는 const&"constref"를 의미하는 단위 이기 때문에 후자를 더 좋아하고 이름 arg은 모든 유형 지정자와 공백으로 구분됩니다.
Frank

4
@ dehmann : 그러나 int const& ref'const ref'를 의미하는 것이 아니라 'const to const'를 의미하지는 않습니다.
Cedric H.

답변:


112

&와 관련하여 const를 오른쪽에서 왼쪽으로 읽는 것과의 차이 는 없으므로 둘 다 불변의 Fred 인스턴스에 대한 참조를 나타냅니다.

Fred& const참조 자체는 불변이며, 이는 중복 됨을 의미합니다 . 를 처리 할 때 const를 포인터 모두 Fred const*Fred* const유효하지만 다릅니다.

그것은 스타일의 문제이지만 const 멤버 함수를const 포함하여 일관되게 적용 할 수 있기 때문에 접미사로 사용하는 것을 선호 합니다 .


그리고 만들 수있는 지점 무엇을 std::is_const<const T&>::value할 수는 false?
abyss. 7

@ abyss.7 참조 const T; 참조는 변경 가능합니다.
Sean Fausett

125

행동

const T&와 사이에는 의미 상 차이가 없습니다 T const&. 언어는 그것들을 같은 유형으로 취급합니다. (같은 일이에 적용 const T*하고 T const*.)

스타일의 문제

그러나 당신이 문체 적으로 선호 해야하는 것에 관해서는, 나는 많은 다른 답변에서 반대 의견을 제시하고 const T&(및 const T*)를 선호합니다 :

  • const T&Stroustrup의 The C ++ Programming Language 책에 사용 된 스타일 입니다.
  • const T& C ++ 표준 자체에서 사용되는 스타일입니다.
  • const T*K & R의 The C Programming Language 책 에서 사용 된 스타일 입니다.
  • const T* C 표준에서 사용되는 스타일입니다.
  • 때문에 위의 요인으로 생각 const T&/ const T*보다 훨씬 더 관성이 T const&/가 T const*. const T&/ 내가 본 모든 C ++ 및 C 코드에서 / const T*보다 경험적으로 나에게 더 일반적인 것 같습니다 . 나는 일반적인 관행을 따르는 것이 오른쪽에서 왼쪽으로 구문 분석 규칙을 독단적으로 준수하는 것보다 더 읽기 쉽다고 생각합니다.T const&T const*
  • 를 사용 T const*하면 *as 를 잘못 배치하는 것이 더 쉽습니다 T* const(특히 사람들이 익숙하지 않은 경우). 반대로, const* T올바른 구문은 아닙니다.

오른쪽에서 왼쪽으로 구문 분석 규칙은 어떻습니까?

사람들이 사용하기를 좋아하는 오른쪽에서 왼쪽으로의 파싱 논쟁에 관해서는 다른 답변에 대한 주석에서 언급했듯이 const T&오른쪽에서 왼쪽으로도 잘 읽습니다. T 상수에 대한 참조입니다. "T"와 "constant"는 각각 형용사 나 명사로 사용할 수 있습니다. (또한, 읽기, T const*오른쪽에서 왼쪽은 잘못 "포인터 상수로 해석 될 수 있기 때문에 모호 할 수 있습니다 대신"포인터로 T " 상수 T".)


3
+1, 동의했습니다. 코드를 읽을 때 행이 const로 시작하면 const를 쉽게 찾을 수 있습니다. 오른쪽 규칙은 특히 털이 많은 형식 선언을 수동으로 구문 분석 할 때만 필요합니다. 가장 일반적인 경우를 최적화하지 않는 이유는 무엇입니까? 또한 IMHO 유형 선언을 작성하면 수동으로 FSM을 수동으로 실행해야합니다.
Andreas Magnusson

2
-1. 당신의 결론이 얼마나 정당화되고 내가 개인적으로 얼마나 많이 동의하는지에 관계없이 그들은 질문에 직접 대답하지 않습니다 . 이로 인해 간단한 질문에 대한 두 번째 대답은 결론이없고 직접적인 대답이없는 지저분한 수중 기계에 대한 주제가 아닌 횡설수설처럼 보입니다. " 아니요, 두 구문간에 의미 론적 차이는 없지만 다음과 같은 스타일 고려 사항이 있습니다 "라는 간단한 요약을 추가하면 저의 공감대를 얻게됩니다 . 그리고 나서 그 모든 총알.
ulidtko

1
IMO의 이유 const T&는 다음과 같습니다. 1- 왼쪽에서 오른쪽으로 코드를 읽습니다. 그리고 2- 새로운 개념을 설명 할 때 우리는보다 일반적인 개념에서보다 구체적인 개념으로 시작합니다. 여기에서 const키워드는 가변 공간을 두 가지 범주로 나누는 반면 키워드는 유형 지정자가 여러 범주로 나누는 것이 더 일반적입니다.
pooya13

"포인터"는 함께 있어야합니다. T const*
Dexter

13

C와 C ++ 선언 구문 분석에 대한 RIGHT-LEFT 규칙 과 일관성을 유지하기 위해 하나와 동일하지만 작성하는 것이 좋습니다.Fred const &arg

선언, 한정자 및 선언자에 대한 이해를 높이 려면 내용도 참조하십시오 .


1
접미사가 typedef확장 과 함께 더 잘 작동하기 때문에 접미사를 선호합니다 . 예 : typedef int* pointer;, const pointer 아닙니다 const int* , int* const입니다. 접미사 형식이 어색하지 않습니다.
Matthieu M.

4
IMO는 const T&오른쪽에서 왼쪽으로도 잘 읽습니다. T 상수에 대한 참조입니다. T그리고 constant각각 형용사 나 명사로 사용할 수 있습니다.
jamesdlin

7

둘 다 작동하며 여기 에 쓴 사람의 설명이 있습니다.
그를 인용하려면 :

왜? "const"(처음에는 "readonly"라고하고 해당 "writeonly"를 가짐)를 발명했을 때, 나는 모호함없이 그렇게 할 수 있었기 때문에 타입 전후에 들어갈 수있었습니다.




3

참조는 포인터와 같은 방식으로 작동하지 않습니다. 포인터의 경우 'const 포인터'( type * const p) 및 '포인터에 대한 포인터'( const type * p또는 type const * p)를 가질 수 있습니다 .

그러나 참조에 대해서는 이것을 가지고 있지 않습니다. 참조는 항상 동일한 객체를 참조합니다. 그런 의미에서 '참조'는 'const reference'( 'const pointer'를 가질 수있는 것과 같은 방법)라고 생각할 수 있습니다.

따라서 'type & const ref'와 같은 것은 합법적이지 않습니다. 'type에 대한 참조'( type &ref) 및 '상수 유형에 대한 참조 '만 가질 수 있습니다 ( const type &ref또는 type const &ref; 둘 다 정확히 동일 함).

마지막으로 const type, 영어로 발음이 더 정확하다고 해도 쓰기 type const는 "오른쪽에서 왼쪽으로"선언에 대한 체계적인 이해를 허용합니다. int const & ref'ref는 상수 int에 대한 참조'입니다. 또는 더 복잡한 예 : int const * const & refref는 상수 int에 대한 상수 포인터에 대한 참조입니다.

결론 : 귀하의 질문에, 둘 다 정확히 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.