ICC拒绝模板引用成员初始化

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_castinnerOk_示例中一样,使用a 确认期望的类型。
  • 使用()-initialization而不是{}

ICC(19.0.1)这么早执行检查并拒绝直接初始化是否正确?GCC都接受。