在C++代码中使用+后跟::(作用域解析运算符



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

+后面跟着::(作用域解析运算符(是什么意思?

组合没有特殊意义。+是正则前缀运算符。在这种特殊情况下,它可能是多余的,或者对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
}

没有+::。它是一元+算子和::算子。

::foo指的是全局命名空间中的foo。当当前命名空间中存在另一个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)尝试使用lambda调用foo,而在foo(+x)中,lambda被隐式转换为函数指针(因为ClosureType::operator ret(*)(params)()+可用于函数指针,但不适用于lambdas类型(。

相关内容

  • 没有找到相关文章

最新更新