gpt4 book ai didi

c++ - 模板类 std::valarray 推导指南

转载 作者:行者123 更新时间:2023-11-28 04:08:27 25 4
gpt4 key购买 nike

在 C++ 标准中,模板类有以下推导指南 std::valarray<T> :

template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;

但是在该类的构造函数中只有以下适当的构造函数(或者我弄错了?)

valarray(const T&, size_t);

但是如果以类似的推导方式运行下面的演示程序

#include <iostream>
#include <utility>

template <typename T>
struct A
{
A( const T &, size_t ) { std::cout << "A<T>()\n"; }
};

template<class T, size_t cnt>
A(const T(&)[cnt], size_t) -> A<T>;

int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

A obj( a, std::size( a ) );
}

gcc 编译器报错

rog.cc:17:12: error: invalid conversion from 'int*' to 'int' [-fpermissive]
17 | A obj( a, std::size( a ) );
| ^
| |
| int*
prog.cc:7:8: note: initializing argument 1 of 'A<T>::A(const T&, size_t) [with T = int; size_t = long unsigned int]'
7 | A( const T &, size_t ) { std::cout << "A<T>()\n"; }
| ^~~~~~~~~

那么问题来了,到底是C++标准的缺陷,还是编译器的bug,还是我遗漏了什么。

最佳答案

使用 https://en.cppreference.com/w/cpp/numeric/valarray/deduction_guides 给出的示例,我们可以在没有优化的情况下查看编译器输出,看看调用了哪个构造函数:

int a[] = {1, 2, 3};
std::valarray va(a, 3);

https://godbolt.org/z/rtgeoi

main:
[...]
call std::valarray<int>::valarray(int const*, unsigned long)
[...]

C++ 数组很容易衰减到指向其第一个元素的指针。但是,如果没有推导指南,从隐式指南推导的类型将为 std::valarray<int[3]> (从 valarray(const T&, size_t) 生成的指南获胜,因为它不需要数组到指针的转换)。如果我们同时拥有 A(const T&, std::size_t);,这可以在您的示例中得到证明。和 A(const T*, std::size_t);构造函数:

template <typename T>
struct A
{
A(const T&, std::size_t);
A(const T*, std::size_t);
};

int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
A obj(a, 10);
}

// Result:
call A<int [10]>::A(int const (&) [10], unsigned long)

https://godbolt.org/z/nlFlVT

正确添加推导指南可以推导出预期的 int而不是 int[10] : https://godbolt.org/z/efj557

关于c++ - 模板类 std::valarray<T> 推导指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290041/

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