2
나는이 머리를 감쌀 수없는 이상한 버그가 있습니다. 나는 이것을 간단한 예로 축소했다. 비어있는 소멸자를 만들어 문제를 해결할 수는 있지만 실제로 어떤 일이 일어나고 있는지 알고 싶습니다. 함수가 템플릿으로되어있을 때 링커 오류가 소멸자를 찾지 못했습니다.
#include <cstdio>
#include <functional>
struct test {
inline test()
{}
const std::function<void()> f;
const int universe = 42;
};
template<size_t n = 1>
inline void do_test(const test& t = {}) {
printf("%d\n", t.universe);
}
int main(int, char**) {
// test t;
do_test();
return 0;
}
이
오류를 출력, 컴파일되지 않습니다 :clang++ -O3 -std=c++1z -stdlib=libc++ -Wall main.cpp
Undefined symbols for architecture x86_64:
"test::~test()", referenced from:
_main in main-df96d9.o
ld: symbol(s) not found for architecture x86_64
당신도, 나는 test t;
객체를 생성 줄에서 주석 또는 do_test()
에서 템플릿 매개 변수를 제거하면 컴파일합니다. 예제는 단순한입니다
참고, 실제 소프트웨어 등
는 소멸자를 찾는 것에 대해 불평 왜 어떤 생각 사용자 정의 생성자, 템플릿 매개 변수를 필요로?
[여기에 대한 증명] (http://coliru.stacked-crooked.com/a/bbf534d106b15cf2) –
Clang 버그처럼 보입니다. GCC는이 코드에 문제가 없습니다. –
VS2015에서 컴파일 된 것 같습니다. 그때 clang 특정해야합니다. "{}"대신 "test()"를 사용하여 "const test"를 초기화하고 초기화 목록과 관련된 특정 버그인지 확인하십시오. 아마 일어나는 일은 컴파일러가 클래스에 대한 참조를 참조했을 때 클래스의 기본 소멸자를 작성해야한다는 것을 알지 못하는 것입니다. 이니셜 라이저 목록 => 생성자 자동 변환은 한 번만 시작됩니다 수업의 세부 사항을 해결했습니다. –