Почему не делает станд.:: строка обеспечивает неявное преобразование для обугливания*?

Используйте @JsonProperty для отображения выходной строки с DTO исключая:

@JsonProperty ("authorizationToken") частная Строка authToken;

и продолжают использовать объекты в ResponseEntity вместо Строки

 ResponseEntity<SecurityToken> responseEntity = new RestTemplate().postForEntity(
                endpoint,
                credentials,
                SecurityToken.class
        );
26
задан Peter Mortensen 21 May 2012 в 20:57
поделиться

7 ответов

С Языка Программирования на C++ 20.3.7 (шахта акцента):

Преобразование в строку C-стиля, возможно, было обеспечено символом константы оператора* (), а не c_str (). Это обеспечило бы удобство неявного преобразования за счет неожиданностей в случаях, в которых такое преобразование было неожиданно .

22
ответ дан user7116 28 November 2019 в 06:58
поделиться

Я вижу по крайней мере две проблемы с неявным преобразованием:

  • Даже явное преобразование, которое c_str() обеспечивает, достаточно опасно, как. Я видел много случаев, где указатель был сохранен, чтобы использоваться после того, как время жизни объекта исходной строки закончилось (или объект был изменен, таким образом делая недействительным указатель). С явным вызовом к c_str() Вы, надо надеяться, знаете об этих проблемах. Но с неявным преобразованием было бы очень легко вызвать неопределенное поведение как в:

    const char *filename = string("/tmp/") + name;
    ofstream tmpfile(filename); // UB
  • преобразование также произошло бы в некоторых случаях, где Вы не будете ожидать, что это и семантика удивительно по меньшей мере:

    string name;
    if (name) // always true
     ;
    name-2; // pointer arithmetic + UB
    Их могли избежать некоторые средства, но почему входят в эту проблему во-первых?
16
ответ дан Drew Dormann 28 November 2019 в 06:58
поделиться

В книге Josuttis говорится следующее:

Это из соображений безопасности предотвратить непреднамеренные преобразования типов, которые приводят к странному поведению (тип char * часто имеет странное поведение) и неоднозначности (например, в выражении, которое объединяется string и струна до, которую было бы возможно преобразовать string в char * и наоборот).

5
ответ дан Michael Kristofik 28 November 2019 в 06:58
поделиться

Поскольку неявные преобразования почти никогда не ведут себя, как Вы ожидаете. Они могут дать неожиданные результаты в разрешении перегрузки, таким образом, это обычно лучше для обеспечения явного преобразования как станд.:: строка делает.

4
ответ дан jalf 28 November 2019 в 06:58
поделиться

Я дополнение к объяснению, обеспеченному в спецификации (неожиданные неожиданности), если Вы смешиваете вызовы API C со станд.:: строка, действительно необходимо выработать привычку использования:: c_ctr () метод. Если Вы когда-нибудь вызываете varargs функцию (например: printf, или эквивалентный), который требует символа константы*, и Вы передаете станд.:: представьте в виде строки непосредственно (не называя метод извлечения), Вы не получите ошибку компиляции (никакая проверка типа функции varargs), но Вы получите ошибку периода выполнения (расположение класса не двоичное идентичный символу константы*).

Кстати, CString (в MFC) проявляет противоположный подход: это имеет неявный бросок, и расположение класса совместимо с двоичным файлом с символом константы* (или константа w_char*, при компиляции для строк широкого символа, т.е.: "Unicode").

4
ответ дан Evg 28 November 2019 в 06:58
поделиться

Это, вероятно, потому что это преобразование имело бы удивление и специфическую семантику. Особенно, четвертый абзац Вы заключаете в кавычки.

Другая причина состоит в том, что существует неявное преобразование const char* -> string, и это было бы просто обратным, которое будет означать странное поведение wrt разрешение перегрузки (Вы не должны делать и неявные преобразования A->B и B->A).

2
ответ дан jpalecek 28 November 2019 в 06:58
поделиться

Поскольку строки C-стиля являются источником ошибок и многих проблем безопасности, это - путь лучше для создания преобразования явно.

1
ответ дан hyperboreean 28 November 2019 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: