使用 + 后接 ::(C++ 代码中的范围解析运算符

Sun*_*nik 5 c++ scope-resolution-operator

我有以下 C++ 代码片段:

inline std::vector<std::unique_ptr<xir::Tensor>> cloneTensorBuffer(
    const std::vector<const xir::Tensor*>& tensors)
{
    auto ret = std::vector<std::unique_ptr<xir::Tensor>>{};
    auto type = +::DataType::XINT;
    ret.reserve(tensors.size());
    for (const auto& tensor : tensors) {
        ret.push_back(std::unique_ptr<xir::Tensor>(xir::Tensor::create(
            tensor->get_name(), tensor->get_shape(), xir::DataType{type, 8u})));
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

我对这个说法不太清楚:

auto type = +::DataType::XINT;
Run Code Online (Sandbox Code Playgroud)

+后面的::(范围解析运算符)是什么意思?

Kon*_*lph 8

该组合没有特殊意义。+是常规前缀运算符。在这种特殊情况下,它\xe2\x80\x99s可能是多余的,或者执行强制到int. 但是,实际含义可能会有所不同,具体取决于 .xe2\x80\x99 类型的重载方式::DataType::XINT

\n

并且::是常规范围解析运算符。当在子表达式的开头使用时(即没有左侧操作数),它会导致在顶部范围DataType执行查找,即它忽略嵌套范围中的任何遮蔽重新定义:

\n
int x = 1;\n\nvoid f() {\n    int x = 2;\n    std::cout << "inner = " << x << "\\n";   // inner = 2\n    std::cout << "outer = " << ::x << "\\n"; // outer = 1\n}\n
Run Code Online (Sandbox Code Playgroud)\n