다음 구조체 고려 과부하 콤마 연산자 (연산자)과 불가 (?)공극(),
struct S {};
C++ (14)는, 정의는 다음 유효 :
constexpr auto f() { return S{}, 'c'; }
뿐만 아니라 다음과 같은 하나 :
이제constexpr auto f() { return S{}, void(); }
, 두 정의의 첫 번째 포함 다음, 작업 조각을 고려 :
#include<type_traits>
struct S {};
constexpr int operator,(S, char) { return 42; }
constexpr auto f() { return S{}, 'c'; }
int main() {
constexpr int i{f()};
static_assert(i == 42, "!");
static_assert(std::is_same<decltype(f()), int>::value, "!");
}
때문에 기술적으로 말하기뿐만 올바르게 main
기능에 확인 쉼표 연산자 차단 부부 S{}, 'c'
및 정수를 반환의 과부하.
지금, 나는 f
의 두 번째 정의와 동일한 기능을 수행한다고 가정 :이 경우
constexpr auto f() { return S{}, void(); }
, 쉼표 연산자해야 차단 형태 S{}, void()
. (분명한 이유)
어느 다음과 같은 정의의 작품 :
constexpr int operator,(S, void) { return 42; }
아니다 아래와 (즉, 앞의 경우에서 일 것이다) : 쉼표를 오버로드 할 수있는 방법은
template<typename T> constexpr int operator,(S, T &&) { return 42; }
있는가 연산자로 S{}, void()
을 처리할까요?
쉼표 연산자를 그런 식으로 사용할 수 있기 때문에 표준에 부족하지 않습니까? (the standard mentions that overloaded functions involving S
are allowed과 같은 경우에도) 동일한 연산자에 과부하가 걸리지는 않습니까?
주 :이 질문에 호기심을 위해 이루어진다. 제발, 같은 코멘트를 피하십시오 또는 그것은 좋은 연습하지 않습니다. 프로덕션 환경에서는 그렇게 할 계획이 아닙니다. 고맙습니다.
그것은 매우 흥미 롭군요.) –
@JesperJuhl 예, 알고 있습니다. 표준 게릴라. 나는 언어의 가장 모호한 모퉁이를 탐험하고있다. :-) – skypjack
연산자','를'+'로 변경하면 "인수가 'void'유형"오류를 가질 수 없습니다. – kennytm