2013-09-05 4 views
1

Почему в приведенном ниже коде отсутствует ссылка? Я думал, что ссылки на const всегда продлевают срок службы временного до их объема.C++ dangling const ссылается на временный объект

boost::filesystem::recursive_directory_iterator it(dir_name); 
const std::string& extension = it->path().extension().string(); 
std::cout << extension << std::endl; // error, dangling reference 
+2

«[...] Ссылки на const всегда продлевают срок службы временного их объема». Почему они? – JBL

+1

Что говорит вам, что это болтливая ссылка? –

+6

@JBL: Потому что язык говорит об этом. Пока инициализатор фактически является временным. –

ответ

13

Из documentation для class path:

функций членов, описанных как возвращение const string разрешено вернуться const string&

Таким образом, нет никакой гарантии, что string() фактически возвращает временный строка. Это может быть ссылка на строку внутри временного path, возвращенную extension(); что будет не имеют свой срок службы, так как это не, напрямую связанный с местной ссылкой.

2

Не делать extension a const ref. Сделайте это вместо того, чтобы:

const std::string extension = it->path().extension().string(); 
+4

Я думаю, что искатель понимает эту возможность, но задается вопросом, почему их код не ведет себя как [самая важная 'const'] (http: //herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/). – BoBTFish