Fle*_*ght 4 c++ const class-template c++17
我试图使用新的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
}
Run Code Online (Sandbox Code Playgroud)
似乎当const X推导出它的类型时,const-ness不会被执行.我知道这是可能的:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
Run Code Online (Sandbox Code Playgroud)
但这会使每个推导出的类型为const X.
如果有人有任何信息或帮助,将不胜感激!
编辑 我正在使用GCC-7.1.0
这是一个编译器错误 - 特别是gcc bug 80990.这里有两个独立的部分 - 演绎和const.声明:
const X d{ 10 };
Run Code Online (Sandbox Code Playgroud)
将首先执行类模板参数推导以选择哪个X专业化d(因此X<int>由于扣除指南),然后将const其添加到其上(所以X<int> const).
另请注意:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
Run Code Online (Sandbox Code Playgroud)
是不正确的.你不能在那里使用cv-qualifiers.
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |