В C++, если бросок является выражением, каков его тип?

Выяснил проблему: это работает JacksonFactory().createJsonGenerator().searialize() (я ожидал, что он сериализует сериализацию ObjectMapper). Это код для JsonHttpContent.writeTo() (из JsonHttpContent.java в google-http-java-client ):

public void writeTo(OutputStream out) throws IOException {
    JsonGenerator generator = jsonFactory.createJsonGenerator(out, getCharset());
    generator.serialize(data);
    generator.flush();
}

Джексон JsonGenerator ожидает ключевое значение (представляется в Java как Map), что не очевидно из сигнатуры конструктора конструктора JsonHttpContent: JsonHttpContent(JsonFactory, Object).

Итак, если вместо передачи GcmDownstreamDto (как определено в вопрос, который будет работать с ObjectMapper), я должен был сделать следующее:

Map map = new HashMap<>();
List idList = Arrays.asList("ABC");
map.put("registration_ids", idList);

все работает так, как ожидалось, и выход:

{"registration_ids":["ABC"]}

Так что просто не забудьте передать конструктор JsonHttpContent(JsonFactory, Object) a Map в качестве второго параметра, и все будет работать так, как вы ожидали.

115
задан 31 July 2009 в 16:18
поделиться

3 ответа

Согласно стандарту 5.16 параграфа 2 первого пункта, «второй или третий операнд (но не оба) является бросающим выражением (15.1); результат имеет тип другого и является значением». Следовательно, условный оператор не заботится о типе throw-выражения, а просто использует другой тип.

Фактически, в параграфе 1 пункта 15.1 прямо говорится: «Выражение броска имеет тип void».

96
ответ дан David Thornley 5 November 2019 в 09:11
поделиться

From [expr.cond.2] (условный оператор ?: ):

Если второй или третий операнд имеет тип (возможно с квалификацией cv) void, то lvalue-to -rvalue, стандартные преобразования массива в указатель и функции в указатель выполняются на втором и третьи операнды, и одно из следующих должно выполняться:

- Второй или третий операнд (но не оба) являются выражением throw; результат относится к типу другого и является значением R.

- И второй, и третий операнды имеют тип void; результат имеет тип void и является rvalue. [Примечание: это включает случай, когда оба операнда являются выражениями throw. - конец примечания]

Итак, с // 1 вы были в первом случае, с // 2 , вы нарушили «одно из следующих должно выполняться», поскольку в таком случае никто из них этого не делает.

13
ответ дан 24 November 2019 в 02:27
поделиться

«Выражение-бросок имеет тип void»

ISO14882, раздел 15

31
ответ дан 24 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

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