Mic*_*ens 6 c++ templates initialization icc
请考虑以下示例。类模板Sample尝试使用模板参数的成员函数初始化引用成员,并期望该成员函数返回适当的引用。
class Inner
{
public:
Inner() : x_{1}
{
}
private:
int x_;
};
class Outer
{
public:
Inner& GetInner()
{
return inner_;
}
private:
Inner inner_;
};
template<typename T>
class Sample
{
public:
Sample(T& outer) :
innerOk_{static_cast<Inner&>(outer.GetInner())},
innerFail_{outer.GetInner()} // ICC fails with "error: initial value of reference to non-const must be an lvalue"
{
}
private:
Inner& innerOk_;
Inner& innerFail_;
};
int main(int argc, char* argv[])
{
Outer outer;
Sample<Outer> s{outer};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,在看到的实际参数之前T,编译器无法告诉初始化是否有效,或者函数返回的类型是否不合适。因为它也无法确定是否T将要具有这样的功能,或者它是否将要返回任何东西。
以下变通办法使代码通过:
static_cast与innerOk_示例中一样,使用a 确认期望的类型。()-initialization而不是{}。ICC(19.0.1)这么早执行检查并拒绝直接初始化是否正确?GCC都接受。
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |