【发布时间】:2018-06-27 02:32:35
【问题描述】:
这个问题看起来很简单,但我只能用“丑陋”的方式解决它。这是一个简短的代码:
#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 对应项。这让我有些困惑,因为我希望非常量到 const 的转换是“微不足道的”。
通过引入第三个构造函数(在代码示例中注释掉)解决了这个问题,但这看起来有点过头了。
我的问题是:
- 为什么这里没有自动完成非 const 到 const 的转换?
- 能否在不引入第三个非常量版本的构造函数的情况下“修复”这个问题?
- 将构造函数更改为接受
gsl::span而不是std::array也有帮助,但也感觉有点矫枉过正
我正在使用 C++17 设置在 MSVC 2017 15.7.4 上进行编译。
【问题讨论】:
标签: c++ arrays templates c++14 c++17