constexpr lambda / 'x' 没有命名类型;你指的是 'x'?
constexpr lambda / ‘x’ does not name a type; did you mean ‘x’?
我正在尝试使用 C++17 的 constexpr lambda 来获取编译时字符串:
#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);
到目前为止看起来不错。但后来我尝试调用一个成员函数:
x.foo();
使用主干中的当前 gcc (g++ (GCC) 7.0.0 20161102),我收到以下错误消息:
c.cpp:19:1: error: ‘x’ does not name a type; did you mean ‘x’?
x.foo();
有关演示,请参阅 https://godbolt.org/g/uN25e1
因为我什至没有尝试使用 x
作为类型,这让我觉得很奇怪。
这是编译器错误吗?还是 x
真的很奇怪?
正如其他人在评论中指出的那样,这只是调用函数命名空间作用域的结果。
恕我直言,错误消息非常晦涩。
我正在尝试使用 C++17 的 constexpr lambda 来获取编译时字符串:
#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);
到目前为止看起来不错。但后来我尝试调用一个成员函数:
x.foo();
使用主干中的当前 gcc (g++ (GCC) 7.0.0 20161102),我收到以下错误消息:
c.cpp:19:1: error: ‘x’ does not name a type; did you mean ‘x’?
x.foo();
有关演示,请参阅 https://godbolt.org/g/uN25e1
因为我什至没有尝试使用 x
作为类型,这让我觉得很奇怪。
这是编译器错误吗?还是 x
真的很奇怪?
正如其他人在评论中指出的那样,这只是调用函数命名空间作用域的结果。
恕我直言,错误消息非常晦涩。