Является ли использование строковой константы в тернарном операторе C ++ недопустимым использованием массива без lvalue? - PullRequest
4 голосов
/ 01 июля 2019

У меня есть код, который проверяет условие с помощью троичного оператора, а затем либо возвращает указатель на константу c-строки, либо выдает исключение.

Странно, компиляция завершается ошибкой только тогда, когда я throw с одного пути троичного оператора. Если я поставлю строковую константу с обеих сторон, все скомпилируется.

// this line gives no compilation error
auto str = condition ? "foo" : "bar";

// this line gives "error: invalid use of non-lvalue array"
auto str = condition ? "foo" : throw std::runtime_error{"bad"};

Эта проблема начала появляться в gcc 9.1. В течение многих лет я использовал строки с обоими вышеуказанными шаблонами, и они без предупреждения компилируются в clang и более ранних версиях gcc.

Действительно ли вышеприведенный шаблон недействителен или это ошибка компилятора в gcc 9.1?

1 Ответ

2 голосов
/ 01 июля 2019

Вы правы. Тернарный оператор распространяет тип и категорию значения одного операнда, если другой является бросающим выражением. Условное выражение является lvalue типа const char[4]. auto затем выводит const char*. Здесь нет «недопустимого использования массива не-lvalue».

Кроме того, код отлично компилируется с помощью clang. Я бы сказал, что это ошибка в GCC.

...