Rozważmy następujący struct (?):Pustka(), operator przecinek (operator) i niemożliwe przeciążenia
struct S {};
w C++ 14, definicja poniżej jest poprawny:
constexpr auto f() { return S{}, 'c'; }
jak również po jednym:
constexpr auto f() { return S{}, void(); }
teraz rozważmy następujący fragment roboczą, która obejmuje pierwszy z dwóch definicji :
#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, "!");
}
nie Mówiąc tak technicznie, przeciążenie operatora przecinkami przechwytuje para S{}, 'c'
i zwraca liczbę całkowitą, jak poprawnie zweryfikowany w funkcji main
.
Teraz załóżmy, że chcę zrobić to samo z drugą definicją f
:
constexpr auto f() { return S{}, void(); }
W tym przypadku operator przecinek powinien przechwytujący forma S{}, void()
.
Ani następujących utworów Definition (z oczywistych powodów):
constexpr int operator,(S, void) { return 42; }
Ani jeden poniżej (które pracowały w poprzednim przypadku):
template<typename T> constexpr int operator,(S, T &&) { return 42; }
Czy istnieje jakiś sposób, aby przeładowywać przecinek operator, aby poradzić sobie z S{}, void()
?
Czy nie jest to inaczej brak standardu, ponieważ pozwala on w ten sposób korzystać z operatora przecinka, ale nie daje możliwości przeciążenia tego samego operatora (nawet jeśli the standard mentions that overloaded functions involving S
are allowed)?
Uwaga: kwestia ta jest wykonana ze względu na ciekawość. Proszę, unikaj komentarzy, takich jak , nie rób tego lub to nie jest dobra praktyka. Nie zamierzam tego robić w środowiskach produkcyjnych. Dziękuję Ci.
To intrygująco szalone;) –
@JesperJuhl Tak, wiem. Standardowa partyzantka. Odkrywam najbardziej niejasne zakątki tego języka. :-) – skypjack
Zmiana operatora ',' na '+' daje "argument może nie mieć 'void' type" error. – kennytm