繁体   English   中英

C ++ 17类模板推导常量

[英]C++17 class template deduction const-ness

我试图使用新的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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM