我有以下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类型(。