내가 함께 작업 한 모든 C ++ 연산자는 무언가를 반환합니다. 예를 들어 +
연산자는 더하기 결과를 반환합니다.
모든 C ++ 연산자가 무언가를 반환합니까, 아니면 아무것도 반환하지 않는 C ++ 연산자가 있습니까?
답변
아니요, 모든 연산자가 무언가를 반환하는 것은 아닙니다.
그것들은 아마도 당신이 생각하는 것과 정확히 일치 하지는 않지만 , delete
그리고 delete[]
C ++ ‘키워드’는 실제로 연산자 라는 점에 유의하십시오 . 그리고 그들은 void
반환 유형 을 갖는 것으로 정의됩니다 -이는 아무것도 평가 하지 않음 을 의미합니다 ( ‘무언가’ 가 아님 ).
에서 cppreference :
void operator delete ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;
답변
사용자 정의 유형의 연산자는 가장 이상한 작업을 수행하기 위해 오버로드 될 수 있습니다.
예를 들어 + 연산자는 더하기 결과를 반환합니다.
반드시 그런 것은 아닙니다.
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
여기서 멤버에 operator+
왼쪽을 추가 value
하고 반환 유형은 무효입니다. 이것은 구성된 예제이지만 일반적으로 사용자 지정 연산자에서 무언가를 반환하지 않는 것은 드문 일이 아닙니다.
오버로드 될 수 있고 내가 알고있는 무언가를 반환해야하는 유일한 연산자는 operator->
. 원시 포인터 또는 operator->
.
답변
간단히 말해서 연산자는 아무것도 반환하지 않습니다. 그것들은 언어로 표현을 만드는 데 사용하는 어휘 요소 일뿐입니다. 이제 표현식에는 유형이 있고 값으로 평가 될 수 있습니다. “물건을 반환하는”연산자가 이것이 의미하는 바라고 가정합니다.
그리고, 네. 유형이있는 C ++ 표현식이 있습니다 void
(결과적으로 어떤 값으로도 평가되지 않음). 일부는 명백하고 다른 일부는 덜합니다. 좋은 예는
throw std::runtime_error()
throw
C ++ 문법의 표현식입니다. 예를 들어 조건식과 같은 다른 표현식에서 사용할 수 있습니다.
return goodStatus() ? getValue() : throw std::runtime_error();
그리고 던지기 표현의 유형은입니다 void
. 이로 인해 실행이 빠르게 다른 곳으로 이동하기 때문에 표현식은 가치가 없습니다.
답변
기본 제공 C ++ 연산자 중 어떤 것도 반환 하지 않습니다. 오버로드 된 C ++ 연산자는 연산자 표기법이 함수 호출에 대한 구문 설탕 인 경우 무언가를 반환합니다.
오히려 연산자는 모두 무언가를 평가 합니다. 그 무언가는 잘 정의 된 값 과 유형을 가지고 있습니다. 도 함수 호출 연산자 void operator()(/*params*/)
A는 void
타입.
예를 들어 +'a'
는 플랫폼 int
에서 'a'
인코딩 된 값을 가진 유형입니다 .
질문이 “C ++ 연산자가 void
반환 유형을 가질 수 있습니까 ?”인 경우 그렇다면 대답은 확실히 그렇습니다.
답변
실제로 아무것도 반환하지 않도록 함수 호출 연산자 를 정의 할 수 있습니다 . 예를 들면 :
struct Task {
void operator()() const;
};
답변
연산자 void () : 사용자 정의 변환 함수 를 void로
operator void()
컴파일러가 T
to void
conversion 함수 가 사용되지 않을 것이라고 경고 하는 독특한 변환 함수를 정의 할 수 있습니다 .
#include <iostream>
struct Foo {
operator void() { std::cout << "Foo::operator void()!"; }
// warning: conversion function converting 'Foo' to
// 'void' will never be used
};
int main() {
Foo f;
(void)f; // nothing
f.operator void(); // Foo::operator void()!
}
[class.conv.fct] / 1 에 의해 관리 됨
[…] 변환 함수는 (아마도 cv-qualified) 객체 를 (아마도 cv-qualified) 동일한 객체 유형 (또는 그에 대한 참조)으로, (아마도 cv-qualified) 기본 클래스 로 변환하는 데 사용되지 않습니다. 유형 (또는 그것에 대한 참조)의 나 에 (아마도 CV 정규화)
void
. 117( 117 )
이러한 변환은 과부하 해결 ([over.best.ics], [over.ics.ref]) 및 따라서 초기화 ([dcl.init]) 및 명시 적 캐스트를위한 표준 변환으로 간주됩니다. 로 변환void
은 변환 함수 ([expr.static.cast])를 호출하지 않습니다. 변환을 수행하기 위해 직접 호출되지는 않지만 이러한 변환 함수는 선언 될 수 있으며 잠재적으로 기본 클래스의 가상 변환 함수에 대한 호출을 통해 도달 할 수 있습니다.
그러나 위에 표시된 것처럼 명시 적 .operator void()
구문을 사용하여 호출 할 수 있습니다 .
답변
언어에 의해 정의 된 (내장) 연산자는 다양한 종류의 계산을 수행하는 데 사용되는 토큰입니다.
- 산술 (+,-, *, /)
- 증가 / 감소 (++,-)
- 할당 (=, + =,-=, * =, / =, % =, >> =, << =, & =, ^ =, | =)
- 논리 (!, &&, ||)
- 관계형 (==,! =,>, <,> =, <=)
- 조건부?
- 반점
등등. 목록은 매우 광범위 할 수 있습니다.
같은 언어를 참고 문헌 이 하나 또는 이것 이 반드시 단순한 산술 또는 논리 수행하는 것을 복귀로 참조되지 않는 조작 변수를 의미하는 비교가 변형 될 수있다, 등등
이 연산은 어떤 값을 생성하기 때문에 연산자에 의해 “반환 된”것으로 해석 될 수 있지만 함수 반환 값과는 다릅니다.
반면에 오버로드 된 연산자는 일부 유형의 반환 값으로 정의 할 수 있습니다. 이는 void 일 수 있으므로 모든 연산자가 C ++에서 일부 값을 반환하지는 않습니다.