c++用户定义的文字操作符可以传递空指针吗?

Can a C++ user-defined literal operator ever be passed a null pointer?

本文关键字:空指针 定义 用户 文字 操作符 c++      更新时间:2023-10-16

c++用户定义的文字操作符可以传递空指针吗?

这确实发生在g++的实验版本(gcc version 4.7.0 20111114 (experimental) [trunk revision 181364] (Debian 20111114-1)),但我不确定这是一个bug(90%确定)还是一些奇怪的预期行为。

示例程序:

#include <iostream>
#include <stdexcept>
#include <string>
std::string operator "" _example (const char * text) {
  using std::cerr;
  using std::endl;
  cerr << "text (pointer) = " << static_cast<const void *>(text) << endl;
  if (!text) throw std::runtime_error("Is a null pointer really expected?");
  cerr << "text (string) = "" << text << '"' << endl;
  return text;
}
int main() {
  2_example;
  1_example;
  0_example;
}

输出(可能是gcc中的错误…但也许不是?,因此问题):

text (pointer) = 0x8048d49
text (string) = "2"
text (pointer) = 0x8048d4b
text (string) = "1"
text (pointer) = 0
terminate called after throwing an instance of 'std::runtime_error'
  what():  Is a null pointer really expected?
Aborted

不只是"0_example";当字面值为0时。例如,即使字面值为"0x0000_example",它仍然会发生。

这是一个bug吗?或者一些奇怪的特殊情况,当文字的值为零?

正如Alf p . Steinbach在一个很好的评论中向我保证的那样,这是一个错误,不是标准行为(没什么大不了的,因为我使用的是gcc快照)。

我去提交一个gcc bug,但看起来它已经被归档并修复了:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50958