【问题标题】:C++17 class template deduction const-nessC++17 类模板推导 const-ness
【发布时间】:2017-12-30 17:26:11
【问题描述】:

我正在尝试使用新的 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

【问题讨论】:

  • godbolt.org/g/kRdTpJ clang trunk 你的代码没有问题。 gcc trunk 也没有问题:godbolt.org/g/TpneVq 看起来只是一个编译器错误。大概您正在尝试使用 gcc 7.1? godbolt.org/g/j6W3dB(该行失败)
  • 编译的时候有没有报错?还是仅在执行期间?
  • @Fenixrw 这是一个失败的静态断言——这只是一个编译时问题
  • @xaxxon 这在 clang 上完全编译了吗?
  • @FletcherBlight 我发布了链接...这是打开“链接”选项的链接..godbolt.org/g/qm77Mx

标签: c++ constants c++17 class-template


【解决方案1】:

这是一个编译器错误 - 特别是 gcc bug 80990。这里有两个独立的部分 - 扣除和const。声明:

const X d{ 10 };

将首先执行类模板参数推导以选择X 特化d 是(所以X&lt;int&gt; 由于推导指南),然后const 被添加到上面(所以X&lt;int&gt; const )。


还要注意:

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

格式不正确。你不能在那里使用 cv 限定符。

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多