2017-05-21 4 views
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()에서 템플릿 매개 변수를 제거하면 컴파일합니다. 예제는 단순한입니다

참고, 실제 소프트웨어 등

는 소멸자를 찾는 것에 대해 불평 왜 어떤 생각 사용자 정의 생성자, 템플릿 매개 변수를 필요로?

+0

[여기에 대한 증명] (http://coliru.stacked-crooked.com/a/bbf534d106b15cf2) –

+1

Clang 버그처럼 보입니다. GCC는이 코드에 문제가 없습니다. –

+0

VS2015에서 컴파일 된 것 같습니다. 그때 clang 특정해야합니다. "{}"대신 "test()"를 사용하여 "const test"를 초기화하고 초기화 목록과 관련된 특정 버그인지 확인하십시오. 아마 일어나는 일은 컴파일러가 클래스에 대한 참조를 참조했을 때 클래스의 기본 소멸자를 작성해야한다는 것을 알지 못하는 것입니다. 이니셜 라이저 목록 => 생성자 자동 변환은 한 번만 시작됩니다 수업의 세부 사항을 해결했습니다. –

답변

0

확답 된 버그가 < 인 것으로 보입니다.