std::array<const T, n> vs std::array<T, n> 过载分辨率
std::array<const T, n> vs std::array<T, n> overload resolution
这个问题看起来很简单,但我只能用"丑陋"的方式解决它。下面是一个简短的代码:
#include <array>
struct A {
A(int , int = 0) {}
A(std::array<const int, 2>) {}
//A(std::array<int, 2>) {}
};
int main(){
std::array<int, 2> a = {0};
const A x(a);
return 0;
}
按原样,编译器正在尝试使用A(int, int = 0)
构造函数,当然,std::array
无法int
转换。
注释掉第一个构造函数会给出一个明显的编译器错误,std::array<int, 2>
不能自动转换为它的 const 对应项。这对我来说有点令人费解,因为我希望非常量到常量转换是"微不足道的"。
通过引入第三个构造函数(在代码示例中注释掉(解决了该问题,但这看起来有点矫枉过正。
我的问题是:
- 为什么非常量到常量转换在这里没有自动完成?
- 是否可以在不引入构造函数的第三个非常量版本的情况下"修复"此问题?
- 更改构造函数以接受
gsl::span
而不是std::array
也有帮助,但也感觉有点矫枉过正
我正在使用 C++17 设置在 MSVC 2017 15.7.4 上进行编译。
1( 为什么这里的非常量到常量转换没有自动完成?
因为std::array<T, Dim> const
和std::array<T const, Dim>
是不同的类型,而且,我的clang++怎么说,"没有已知的从'array<int, [...]>
'到'array<const int, [...]>
'的转换">
2(是否可以在不引入构造函数的第三个非常量版本的情况下"修复"此问题?
模板构造函数呢
template <typename T>
A (std::array<T, 2> const &) {}
T
在哪里可以同时匹配int
和int const
?
如果你想强加T
只是int
或int const
(而不是,例如,long const
(,你可以通过SFINAE来做到这一点
template <typename T>
A (std::array<T, 2>,
std::enable_if_t<std::is_same<T const, int const>{}> * = nullptr)
{ }
所以你可以拥有
std::array<int, 2> a = {{0}};
std::array<int const, 2> b = {{0}};
std::array<long const, 2> c = {{0}};
const A x(a); // compile
const A y(b); // compile
const A z(c); // compilation error
3(将构造函数更改为接受gsl::span而不是std::array也有帮助,但也感觉有点矫枉过正
对不起,我不明白第三个问题(?((我不知道gls::span
(
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>
- 如何获取std::vector<DMatch>