在c ++中,双冒号之前的&符是什么意思?

tia*_*549 0 c++

我在google的protobuf生成的以下代码中发现了这种用法.

inline void Datum::set_data(const void* value, size_t size) {
  set_has_data();
  //over here.
  if (data_ == &::google::protobuf::internal::kEmptyString) {
     data_ = new ::std::string;
  }
 data_->assign(reinterpret_cast<const char*>(value), size);
}
Run Code Online (Sandbox Code Playgroud)

谢谢:-)!

pax*_*blo 8

这是两个完全不相关的东西,或许更好地被认为是

&(::google::protobuf::internal::kEmptyString)
Run Code Online (Sandbox Code Playgroud)

& 只是表示操作符的地址,与您完成的操作完全相同:

int xyzzy = 7;
int *pointer_to_xyzzy = &xyzzy;
Run Code Online (Sandbox Code Playgroud)

::,而另一方面,是全局命名空间符,以确保您不会开始寻找在当前的命名空间.

例如,以下程序:

#include <iostream>

int x = 7;
namespace xyzzy {
    int x = 42;
    int getxa() { return ::x; }
    int getxb() { return x; }
}

int main() {
    std::cout << xyzzy::getxa() << '\n';
    std::cout << xyzzy::getxb() << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于函数使用全局命名空间说明符而不是一个,因此7后跟输出.42getxa()xyzzy