【发布时间】:2019-10-08 15:59:34
【问题描述】:
在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++ 标准的缺陷,还是编译器的错误,或者我遗漏了什么。
【问题讨论】:
标签: c++ class c++17 type-deduction construct