임시가 생성자의 이니셜 라이저 목록에있는 참조 멤버에 바인딩되어 있으면 생성자가 반환 할 때 개체가 파괴된다는 것을 알고 있습니다. 생성자에서 참조 멤버에 임시 바인딩에 대한 가짜 경고
그러나, 다음 코드를 고려하십시오 는
#include <functional>
#include <iostream>
using callback_func = std::function<int(void)>;
int
func(const callback_func& callback)
{
struct wrapper
{
const callback_func& w_cb;
wrapper(const callback_func& cb) : w_cb {cb} { }
int call() { return this->w_cb() + this->w_cb(); }
};
wrapper wrp {callback};
return wrp.call();
}
int
main()
{
std::cout << func([](){ return 21; }) << std::endl;
return 0;
}
이 나에게 완벽하게 유효한 보인다. callback
개체는 func
함수의 전체 실행 중에 작동하며 wrapper
의 생성자에 대한 임시 복사본을 만들지 않아야합니다.
실제로, GCC 4.9.0은 모든 경고가 활성화 된 상태에서 정상적으로 컴파일됩니다.
$ g++ -std=c++11 -W main.cpp
main.cpp: In constructor ‘func(const callback_func&)::wrapper::wrapper(const callback_func&)’:
main.cpp:12:48: warning: a temporary bound to ‘func(const callback_func&)::wrapper::w_cb’ only persists until the constructor exits [-Wextra]
wrapper(const callback_func& cb) : w_cb {cb} { }
^
이 거짓 긍정적인가, 아니면 내가 개체의 수명을 오해하고 있습니다 :
그러나 GCC 4.8.2 컴파일러는 나에게 다음과 같은 경고 준다? 여기
내 정확한 컴파일러 버전 테스트 :
$ g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ --version
g++ (GCC) 4.9.0 20140604 (prerelease)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
최적화를 해제하면 오류가 발생합니다. Valgrind는 문제가'func (std :: function const &) :: wrapper :: call()'어딘가에 있다고 지적합니다. –
'w_cb {cb}'를 사용하면 세분화 위반이 발생합니다. 'w_cb (cb)'를 사용하면 같은 문제가 발생하지 않습니다. g ++ 4.8.3에서 테스트되었습니다. –
GCC 4.8.2에서 Valgrind 오류를 재현 할 수있었습니다. GCC 4.9.0에 의해 생성 된 실행 파일은 Valgrind-clean입니다. (세그 폴트, 터프가 아니라, 프로그램이 42를 출력하고 예상대로 성공적으로 종료됩니다.) 이러한 관찰은 최적화 수준에 따라 달라지지 않습니다. – 5gon12eder