Vla*_*cow 4 c++ gcc operator-overloading valarray c++20
我尝试了以下程序
#include <iostream>
#include <valarray>
int main( void )
{
std::valarray<int> v1 = { 1, 2, 3, 4, 5 };
std::valarray<int> v2 = { 1, 2, 3, 4, 5 };
auto v3 = v1 * v2;
for ( const auto &item : v3 ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并得到了一条错误消息,适当的函数begin用于v3本声明隐含使用
for ( const auto &item : v3 ) std::cout << item << ' ';
Run Code Online (Sandbox Code Playgroud)
找不到。
所以我尝试了以下代码
#include <iostream>
#include <valarray>
#include <type_traits>
int main( void )
{
std::valarray<int> v1 = { 1, 2, 3, 4, 5 };
std::valarray<int> v2 = { 1, 2, 3, 4, 5 };
auto v3 = v1 * v2;
std::cout << std::is_same<std::valarray<int>, decltype( v3 )>::value << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
得到了结果
0
Run Code Online (Sandbox Code Playgroud)
但是当这句话
auto v3 = v1 * v2;
Run Code Online (Sandbox Code Playgroud)
更改为
std::valarray<int> v3 = v1 * v2;
Run Code Online (Sandbox Code Playgroud)
那么输出是
1
Run Code Online (Sandbox Code Playgroud)
在operator *对std::valarray<int>声明如下方式
template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&);
Run Code Online (Sandbox Code Playgroud)
那么这是实现的错误std::valarray<int>吗?
这不是错误。 std::valarray::operator*实际上不必返回a,std::valarray因为它允许使用表达式模板。这意味着它可以返回具有以下属性的类型:
- 提供了的所有const成员函数
std::valarray。std::valarray,std::slice_array,std::gslice_array,std::mask_array和std::indirect_array可以从替换型构造。- 所有接受类型为
const std::valarray&(begin()和end()(自C ++ 11)以来)的参数的函数也应接受替换类型。- 所有接受两个类型参数的函数
const std::valarray&都应接受const std::valarray&和替换类型的每种组合。- 在最深层嵌套的参数类型上,返回类型不会添加超过两个级别的模板嵌套。
重点矿源
因此,您需要明确地将返回值捕获为,std::valarray以便std::begin可以调用的专门化。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |