У меня есть код, который проверяет условие с помощью троичного оператора, а затем либо возвращает указатель на константу 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?