5

我有以下 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;
}

我不清楚声明:

auto type = +::DataType::XINT;

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

4

2 回答 2

8

该组合没有特殊含义。+是常规前缀运算符。在这种特殊情况下,它可能是多余的,或者对int. 但是,实际含义可能会有所不同,具体取决于::DataType::XINT.

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

int x = 1;

void f() {
    int x = 2;
    std::cout << "inner = " << x << "\n";   // inner = 2
    std::cout << "outer = " << ::x << "\n"; // outer = 1
}
于 2022-01-17T09:54:55.210 回答
4

没有+::。它是一元运算+符和::运算符。

::foofoo在全局命名空间中引用。DataTye::XINT当当前名称空间中有另一个名称空间时,它可能是必要的。

一元+有时用于触发隐式转换。您需要检查::DataType::XINT它是什么类型以及它有哪些可用的转换。

因为我不知道是什么::DataType::XINT,这里有一个 lambda 表达式的例子:

template <typename T>
void foo();

int main() {
    auto x = [](){};
    foo(x);
    foo(+x);
}

错误消息(缩短)是:

<source>:6:8: error: no matching function for call to 'foo(main()::<lambda()>&)'
    6 |     foo(x);
<source>:7:8: error: no matching function for call to 'foo(void (*)())'
    7 |     foo(+x);
      |     ~~~^~~~

您可以看到foo(x)尝试foo使用 lambda 调用,而在foo(+x)lambda 中被隐式转换为函数指针(因为函数指针可用ClosureType::operator ret(*)(params)()+可用于函数指针,但不适用于 lambdas 类型)。

于 2022-01-17T10:02:08.317 回答