2016-11-02 2 views
4

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?

+0

Können Sie zu einer Demo verlinken? https://godbolt.org/g/lWExfT Scheint zu arbeiten – themagicalyang

+0

@themagicalyang Fügen Sie einfach die 'x.foo()' hinzu. Hinzufügen des Demo-Links – Rumburak

+5

'x.foo()' wurde hinzugefügt. Sie müssen 'x.foo()' in main aufrufen. @Rumburak – themagicalyang

Antwort

0

Wie in den Kommentaren anderer erwähnt, ist dies nur ein Ergebnis des Aufrufs eines Funktionsnamensraumbereichs.

IMHO, die Fehlermeldung ist jedoch ziemlich obskur.

Verwandte Themen