gpt4 book ai didi

c++ - 为什么 `std::remove_cv<_Iter>::type` 不是一个类型?

转载 作者:行者123 更新时间:2023-12-02 02:19:04 25 4
gpt4 key购买 nike

我有两个版本的功能,但 gcc 说版本 1 有效,而版本 2 给出了

expected a type, got 'std::remove_cv<_Iter>::type'

我不太明白这个错误,因为我预计using语句需要一个类型,并且不会自动提升 'std::remove_cv<_Iter>::type'到别的东西?

有人可以解释一下这里发生了什么吗?

template<typename U,typename V> constexpr inline auto is_same_rcv() noexcept
{
//version 1 works
using u_underlying = std::remove_cv<U>::type;
using v_underlying = std::remove_cv<V>::type;
return std::is_same<u_underlying,v_underlying>::value;
}

template<typename U,typename V> constexpr inline auto is_same_rcv() noexcept
{
//version 2 doesn't work
using u_underlying = std::remove_cv<U>::type;
return std::is_same<u_underlying,std::remove_cv<V>::type>::value;
}

关联godbolt

为了好玩而编辑,看起来 clang 和 gcc 对 using 关键字的解释不同(参见 https://godbolt.org/z/P9Pcn6 )

最佳答案

您需要使用关键字 typename 告诉 dependent names std::remove_cv<V>::type是一种类型。

return std::is_same<u_underlying, typename std::remove_cv<V>::type>::value;
// ^^^^^^^^

using声明typename自 C++20 起不再需要。

In some contexts, only type names can validly appear. In thesecontexts, a dependent qualified name is assumed to name a type and notypename is required:

  • ...

  • A qualified name that appears in type-id, where the smallest enclosing type-id is:

关于c++ - 为什么 `std::remove_cv<_Iter>::type` 不是一个类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66701132/

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