模板函数类型推导及返回类型

4
为什么 atruebfalse?或者换句话说,为什么 foo1 中的 Tint const,但 foo2 的返回类型只是 int
template<typename T>
constexpr bool foo1(T &) {
    return std::is_const<T>::value;
}

template<typename T>
T foo2(T &);

int main() {
    int const x = 0;
    constexpr bool a = foo1(x);
    constexpr bool b = std::is_const<decltype(foo2(x))>::value;
}

我没有检查foo1的返回类型。仔细看。 - omicronns
哦,看错了。那这就是重复的了。 - Passer By
@Incomputable 这是针对参数类型的不同规则。 - T.C.
@T.C.,它提到要在顶级移除constness。 - Incomputable
@Incomputable的函数参数。这里涉及到完全不同的规则。 - T.C.
显示剩余2条评论
2个回答

6

这个叫做const int foo2<const int>(const int&)的特化,返回类型是const int,因此foo2(x)将成为一个类型为const int的prvalue。然而,在你的情况下(即int),不存在非数组、非类类型的const(或volatile)prvalue。在"进行任何进一步分析之前",constness被调整掉了,它变成了一个类型为int的prvalue,并由decltype报告。


2

如果函数返回类型是非类、非数组类型,则忽略const限定符。如果您使用某个类代替普通的int,则会产生1 1:

  struct Bar{};

  int main()
  {
     Bar const x{};
     constexpr bool a = foo1(x);
     constexpr bool b = std::is_const<decltype(foo2(x))>::value;
  }

online compiler


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接