C++17 class 模板推导常量性
C++17 class template deduction const-ness
我正在尝试使用新的 c++17 class 模板推导,在我应用 const 之前它似乎一切正常。这是我面临的麻烦的一个小例子:
#include <type_traits>
template <typename T>
struct X
{
T _data;
X(void) = default;
X(T && data) : _data{ data } {}
constexpr bool const_x(void) { return false; }
constexpr bool const_x(void) const { return true; }
};
template <typename T>
X(T &&) -> X<std::remove_reference_t<T>>;
int main(void)
{
X<int> a;
const X<int> b{};
X c{ 10 };
const X d{ 10 };
static_assert(!a.const_x());
static_assert(b.const_x());
static_assert(!c.const_x());
static_assert(d.const_x()); // assert fails
}
看起来当一个 const X 推导它的类型时,const-ness 并没有被贯彻。我知道这是可能的:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
但这会使每个推导类型都为 const X。
如果有人有任何信息或帮助,将不胜感激!
编辑 我正在使用 GCC-7.1.0
这是一个编译器错误 - 特别是 gcc bug 80990。这里有两个独立的部分——推导和 const
。宣言:
const X d{ 10 };
将首先执行 class 模板参数推导以选择 X
专业化 d
是(因此 X<int>
由于推导指南),然后 const
被添加到上面(所以 X<int> const
)。
另请注意:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
格式错误。你不能在那里使用 cv 限定符。
我正在尝试使用新的 c++17 class 模板推导,在我应用 const 之前它似乎一切正常。这是我面临的麻烦的一个小例子:
#include <type_traits>
template <typename T>
struct X
{
T _data;
X(void) = default;
X(T && data) : _data{ data } {}
constexpr bool const_x(void) { return false; }
constexpr bool const_x(void) const { return true; }
};
template <typename T>
X(T &&) -> X<std::remove_reference_t<T>>;
int main(void)
{
X<int> a;
const X<int> b{};
X c{ 10 };
const X d{ 10 };
static_assert(!a.const_x());
static_assert(b.const_x());
static_assert(!c.const_x());
static_assert(d.const_x()); // assert fails
}
看起来当一个 const X 推导它的类型时,const-ness 并没有被贯彻。我知道这是可能的:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
但这会使每个推导类型都为 const X。
如果有人有任何信息或帮助,将不胜感激!
编辑 我正在使用 GCC-7.1.0
这是一个编译器错误 - 特别是 gcc bug 80990。这里有两个独立的部分——推导和 const
。宣言:
const X d{ 10 };
将首先执行 class 模板参数推导以选择 X
专业化 d
是(因此 X<int>
由于推导指南),然后 const
被添加到上面(所以 X<int> const
)。
另请注意:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
格式错误。你不能在那里使用 cv 限定符。