Aşağıdaki kod c ++ 17 modunda clang-trunk ile iyi derler, ancak c ++ 2a (yaklaşan c ++ 20) modunda kırılır:
// Meta struct describing the result of a comparison
struct Meta {};
struct Foo {
Meta operator==(const Foo&) {return Meta{};}
Meta operator!=(const Foo&) {return Meta{};}
};
int main()
{
Meta res = (Foo{} != Foo{});
}
Ayrıca gcc-trunk veya clang-9.0.0 ile iyi derler: https://godbolt.org/z/8GGT78
Clang-trunk ve ile ilgili hata -std=c++2a
:
<source>:12:19: error: use of overloaded operator '!=' is ambiguous (with operand types 'Foo' and 'Foo')
Meta res = (f != g);
~ ^ ~
<source>:6:10: note: candidate function
Meta operator!=(const Foo&) {return Meta{};}
^
<source>:5:10: note: candidate function
Meta operator==(const Foo&) {return Meta{};}
^
<source>:5:10: note: candidate function (with reversed parameter order)
C ++ 20'nin sadece aşırı yüklenmeyi mümkün kılacağını operator==
ve derleyicinin operator!=
sonucunu reddederek otomatik olarak üreteceğini anlıyorum operator==
. Anladığım kadarıyla, bu sadece dönüş türü olduğu sürece çalışır bool
.
Sorunun kaynağı Eigen içinde operatörlerin bir dizi ilan olmasıdır ==
, !=
, <
arasında, ... Array
nesneleri veya Array
ve Skalarların, dönüş (bir sentezleme) bir dizi bool
daha sonra öğeye erişilebilir veya başka bir şekilde kullanılabileceğini ( ). Örneğin,
#include <Eigen/Core>
int main()
{
Eigen::ArrayXd a(10);
a.setRandom();
return (a != 0.0).any();
}
Yukarıdaki örneğimin aksine, bu gcc-trunk ile bile başarısız oluyor: https://godbolt.org/z/RWktKs . Bunu hem clang-trunk hem de gcc-trunk'ta başarısız olan Eigen olmayan bir örneğe indirmeyi başaramadım (üstteki örnek oldukça basitleştirilmiş).
İlgili sorun raporu: https://gitlab.com/libeigen/eigen/issues/1833
Asıl sorum: Bu aslında C ++ 20'de bir kırılma değişikliği mi (ve Meta-nesneleri döndürmek için karşılaştırma işleçlerini aşırı yükleme olasılığı var mı) yoksa clang / gcc'de bir gerileme olasılığı daha mı yüksek?