Может ли пользовательский литеральный оператор C ++ когда-либо передавать нулевой указатель? - PullRequest
7 голосов
/ 05 декабря 2011

Может ли пользовательский литеральный оператор C ++ когда-либо передавать нулевой указатель?

Это действительно происходит с экспериментальной версией g ++ (gcc версия 4.7.0 20111114 (экспериментальная) [trunk revision 181364] (Debian 20111114-1)) но я не уверен, является ли это ошибкой (на 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";это всякий раз, когда буквальное значение равно нулю.Например, это все еще происходит, даже если литерал "0x0000_example".

Это ошибка?Или какой-то странный особый случай, когда значение литерала равно нулю?

1 Ответ

5 голосов
/ 05 декабря 2011

Как уверял меня Альф П. Штейнбах в хорошем комментарии, это ошибка, а не стандартное поведение (ничего страшного, поскольку я использовал снимок gcc).

Я отправил файл об ошибке gcc, но похоже, что оно уже было зарегистрировано и исправлено:

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

...