programme:
#include <stdio.h>
struct bar_t {
int value;
template<typename T>
bar_t (const T& t) : value { t } {}
// edit: You can uncomment these if your compiler supports
// guaranteed copy elision (c++17). Either way, it
// doesn't affect the output.
// bar_t () = delete;
// bar_t (bar_t&&) = delete;
// bar_t (const bar_t&) = delete;
// bar_t& operator = (bar_t&&) = delete;
// bar_t& operator = (const bar_t&) = delete;
};
struct foo_t {
operator int () const { return 1; }
operator bar_t () const { return 2; }
};
int main ()
{
foo_t foo {};
bar_t a { foo };
bar_t b = static_cast<bar_t>(foo);
printf("%d,%d\n", a.value, b.value);
}
sortie de gcc 7/8:
2,2
sortie pour clang 4/5 (également pour gcc 6.3)
1,1
Il semble que la suite se passe lors de la création d'instances de l' bar_t
:
Pour gcc, il calls foo_t::operator bar_t
alors constructs bar_t with T = int
.
Pour le bruit, c' constructs bar_t with T = foo_t
alors calls foo_t::operator int
Le compilateur est correct ici? (ou peut-être qu'ils sont tous les deux corrects si ce n'est une forme de comportement indéfini)