Начиная с C++11 стало возможным создавать определяемые пользователем литералы. Как и ожидалось, из таких литералов можно возвращать сложные структуры. Однако при попытке использовать такие операторы, как 123_foo.bar()
:
struct foo {
int n;
int bar() const { return n; }
};
constexpr foo operator ""_foo(unsigned long long test)
{
return foo{ static_cast<int>(test) };
}
int main() {
return 123_foo.bar();
}
GCC и Clang отклоняют его, говоря, что не могут найти operator""_foo.bar
. MSVC принимает это. Если вместо этого я напишу 123_foo .bar()
, все три компилятора примут его
Кто здесь? Является ли 123_foo.bar()
действительным?
Некоторая дополнительная информация:
- Все три принимают его для строковых литералов.
- Проблема существует и для
std::chrono
литералов.
Я склонен полагать, что это ошибка GCC и Clang, поскольку .
не является частью действительного идентификатора.
.
стоит после идентификатора UDL, поэтому я не понимаю, как здесь применяется максимальное жевание. - person Justin   schedule 01.03.2018_foo.bar
может быть допустимым именем UDL, согласно GCC и Clang! - person Nawaz   schedule 01.03.2018ud-suffix
, что является простоidentifier
? - person Justin   schedule 01.03.2018.
. Не могу сейчас погрузиться в правила грамматики. мне кажется где-то ляп - person Passer By   schedule 01.03.20181_xe+2
будет недопустимым, даже если возвращаемый типoperator""_xe
предоставляетoperator+
, принимающийint
:e+
также допускается в числах. - person   schedule 01.03.20181_foo.bar
ты этого не видел, а для1_foe+bar
видел? :) Это точно такая же логика для обоих. - person   schedule 01.03.20181e+5
? - person Justin   schedule 01.03.20181.
это допустимый литерал с плавающей запятой - person W.F.   schedule 01.03.2018