Ich experimentiere mit C constexpr lambdas des ++ 17 zu erhalten Zeit Strings kompilieren:constexpr Lambda/'x' gibt keinen Typ an; meinst du 'x'?
#include <utility>
template <char...>
struct str
{
constexpr auto operator==(const str&) const { return true; }
void foo() const;
};
template <typename S, std::size_t... Ns>
constexpr auto make_str(S s, std::index_sequence<Ns...>)
{
return str<s()[Ns]...>{};
}
#define LIT(s) \
make_str([]() { return s; }, std::make_index_sequence<sizeof(s) - 1>{})
constexpr auto x = LIT("hansi");
constexpr auto y = x;
static_assert(x == y);
Sieht so weit gut. Aber dann habe ich versucht, eine Memberfunktion aufrufen:
x.foo();
Mit dem aktuellen gcc von Stamm (g ++ (GCC) 7.0.0 20161102), erhalte ich die folgende Fehlermeldung:
c.cpp:19:1: error: ‘x’ does not name a type; did you mean ‘x’?
x.foo();
Siehe https://godbolt.org/g/uN25e1 für eine Demo
Da ich nicht einmal versuche, x
als einen Typ zu verwenden, scheint mir das seltsam.
Ist das ein Compiler Bug? Oder ist x
etwas wirklich seltsam?
Können Sie zu einer Demo verlinken? https://godbolt.org/g/lWExfT Scheint zu arbeiten – themagicalyang
@themagicalyang Fügen Sie einfach die 'x.foo()' hinzu. Hinzufügen des Demo-Links – Rumburak
'x.foo()' wurde hinzugefügt. Sie müssen 'x.foo()' in main aufrufen. @Rumburak – themagicalyang