- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
std::string get(const std::string& name) {
NamedPropertyMap::iterator it = properties.find(name);
if (it == properties.end())
return false;
std::string ret;
it->second->Get(ret);
return ret;
}
TheCalligrapher 30.03.2011 23:37 # +7
Во время выполнения нулевой 'char *' указатель приведет к падению, а вот с точки зрения компиляции тут все в порядке.
Aleskey 30.03.2011 23:46 # 0
flags: -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch
выдает:
std::logic_error: basic_string::_S_construct NULL not valid
Aborted.
А вот как заставить ругаться VS2008?
TheCalligrapher 31.03.2011 01:12 # +3
Библиотека, идущая с VS, отловом такой ситуации не занимается, т.е. вылет будет системный по нарушению защиты памяти. Такое поведение совешенно легально, ибо ничего конкретного (типа бросания 'logic_error') в такой ситуации спецификация не требует. "Заставить" тут ничего не получится.
А вопрос этот, кстати, известный, обсуждался комитетом
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#466
и в конце концов было решено ничего не менять.
rat4 31.03.2011 08:16 # 0
warning: converting 'false' to pointer type for argument 1 of [шаблонная магия]
absolut 31.03.2011 08:28 # +1
Aleskey 31.03.2011 10:10 # 0
Незнание стандарта не освобождает от ответственности :)
Ну не ожидал я, что false будет так implicit преобразован.
Ладно уже с FALSE или NULL, но с false ожидал, что компилятор это отловит.
guest 01.04.2011 15:55 # −2