모든 C ++ 연산자가 무언가를 반환합니까? ++ 연산자는 무언가를 반환합니다. 예를 들어 +연산자는

내가 함께 작업 한 모든 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()

throwC ++ 문법의 표현식입니다. 예를 들어 조건식과 같은 다른 표현식에서 사용할 수 있습니다.

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()컴파일러가 Tto voidconversion 함수 가 사용되지 않을 것이라고 경고 하는 독특한 변환 함수를 정의 할 수 있습니다 .

#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 ++에서 일부 값을 반환하지는 않습니다.