gpt4 book ai didi

C++17类模板推导const-ness

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:34 26 4
gpt4 key购买 nike

我正在尝试使用新的 c++17 类模板推导,在我应用 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 };

将首先执行类模板参数推导来选择哪个X特化d是(所以 X<int> 由于推导指南),然后是 const在其之上添加(所以 X<int> const )。


另请注意:

template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;

格式错误。你不能在那里使用 cv-qualifiers。

关于C++17类模板推导const-ness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45292228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com