const 3

const 멤버 함수의 리턴 타입을 레퍼런스로 할 수 없는 이유/ const 멤버함수 내부에서 const가 아닌 멤버 함수를 호출할 수 없다

위의 GetBar 함수같은 표현은 허용되지 않는다. 그 이유는 stackoverflow에서 쉽게 찾을 수 있다. 요약하자면 레퍼런스를 리턴하면 클래스의 내부 상태(여기선 Bar 멤버 변수)를 바꾸지 않는 다는 것(const)을 보장할 수 없기 때문이다. 따라서 const를 빼던가 레퍼런스(&)를 리턴 타입에서 빼줘야 한다 여담이지만 const 멤버 함수 내부에서는 const 멤버 함수가 아닌 다른 함수를 호출할 수 없다. Reference https://stackoverflow.com/questions/4957025/const-methods-that-return-references/4957167 Const Methods that Return References class Foo { int Bar; pub..

공부/C || C++ 2021.11.12

C2678 : 이항 '~': 왼쪽 피연산자로 '~' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.

~는 내가 쓰던 코드에서 선언한 타입이었다. ~에는 쓴 코드에서 사용한 연산자와 타입이 올 것이다. 에러에 관한 이야기를 하기 전에 짚고 넘어 가야 할 중요한 사실이 있는데 C++에서 const를 요구하는 인자에 non-const를 넘기는 것은 괜찮지만 non-const를 요구하는 곳에 const를 쓰면 에러가 생긴다(https://erlerobotics.gitbooks.io/erle-robotics-cpp-gitbook/content/advanced_topics_i/const_and_non-const.html) 예를 들어서 우리가 흔히 쓰는 복사 생성자는 인자로 const reference 타입을 받지만 인자로 넘겨줄 객체를 const로 선언하지 않아도 에러가 생기지 않는다. 예를 들어서 class A..

공부/그 외 2021.09.02

C++ const가 붙는 위치에 따른 의미변화

포인터 변수의 const는 붙는 위치에 따라 의미가 다르다. 아래 글은 Reference에 쓰여져 있는 포스팅이 정리가 잘 되어 있어서 인용했다. int const * p; // 1 int * const p; // 2 int const * const p; // 3 const int * p; // 4 p = (int *)0x1000; // 가 p++; // 나 *p = 100; // 다 a = *p; // 라 const는 바로 앞의 키워드에 대해 상수화가 이루어진다고 보면 된다. 단 예외적으로 4번은 앞에 아무 키워드도 없으니 뒤에 있는 키워드에 대해 상수화를 시킨다. 그래서 1 -> 값에 대한 상수화 2 -> 포인터에 대한 상수화 3 -> 값, 포인터 모두에 대한 상수화 4 -> 값에 대한 상수화 그래서..

공부/C || C++ 2021.09.01