- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在新的 C++14 运行时大小的数组上测试 type_traits
header 中的一些工具,请考虑以下代码:
int g[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
template <typename T> void print(T &t)
{
std::cout << "Type id: " << typeid(T).name() << '\n';
std::cout << "is_array: " << std::is_array<decltype(T)>::value << '\n';
std::cout << "is_pointer: " << std::is_pointer<decltype(T)>::value << '\n';
std::cout << "extent: " << std::extent<decltype(T)>::value << '\n';
}
int main()
{
print(g);
return 0;
}
静态大小的数组 g
返回以下输出:
Type id: A11_i
is_array: 1
is_pointer: 0
extent: 11
未损坏的名称 A11_i
我假设它是 A11 类型 int 元素的数组,所以这里一切都是正确的,但是使用这个新代码:
void f(std::size_t s)
{
int a[s];
print(a);
}
int main()
{
f(5);
return 0;
}
我遇到错误:
In function 'void f(std::size_t)':
error: no matching function for call to 'print(int [s])'
note: candidate is:
note: template<class T> void print(T&)
note: template argument deduction/substitution failed:
note: variable-sized array type 'int [s]' is not a valid template argument
我没想到大小参数可以传递给模板,但我期待的是自动数组到指针的衰减。我猜 T &
参数不适合这种衰减,所以我尝试将模板签名更改为:
template <typename T> void print(T *&t)
结果相似:
In function 'void f(std::size_t)':
error: no matching function for call to 'print(int [s])'
note: candidate is:
note: template<class T> void print(T*&)
note: template argument deduction/substitution failed:
note: mismatched types 'T*' and 'int [s]'
而且我注意到运行时大小数组上的大小变量似乎与类型相关(而不是 不匹配的类型 'T*' 和 'int [
5
]'
我们得到了不匹配的类型 'T*' 和 'int [
s
]'
) 这看起来很奇怪。
那么,问题是什么?
最佳答案
在模板参数推导期间,仅当函数模板参数的类型不是引用时才使用数组到指针的转换。
§14.8.2.1 Deducing template arguments from a function call [temp.deduct.call]
1 Template argument deduction is done by comparing each function template parameter type (call it
P
) with the type of the corresponding argument of the call (call itA
) as described below. [...]2 If
P
is not a reference type:
- If
A
is an array type, the pointer type produced by the array-to-pointer standard conversion (4.2) is used in place ofA
for type deduction; otherwise,- [...]
关于c++ - 运行时大小的数组和指针衰减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29602638/
liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问: 为什么我们在高速移动的高铁上网络会变
我正在使用 Kinect 获取每个关节的位置和方向,然后将它们发送到 Unity。我注意到值有很多“跳跃”或波动,例如,有时我不移动我的手,而在 Unity 中它会旋转 180 度。 我想要的是一个平
在下面的示例中, #include #include //okay: // template decltype(auto) runner(T&& t, F f) { return f(st
出于某种原因,即使我设置了衰减因子,我的学习率似乎也没有改变。我添加了一个回调来查看学习率,它似乎在每个纪元之后都是一样的。为什么没有变化 class LearningRatePrinter(Call
考虑下面的代码: #include #include using namespace std; template void Test2(future f, Work w) { async([
我是一名优秀的程序员,十分优秀!