Tôi tự hỏi khi nào/nơi diễn ra sự kiện mẫu ngầm trong tình huống sau.Khi nào thì diễn giải mẫu ngầm định xảy ra?
// temp.h
template <typename T>
struct A {
T value;
}
// foo.h
#include "temp.h"
void foo();
// foo.cpp
#include "foo.h"
void foo() { A<int> _foo; }
// bar.h
#include "temp.h"
void bar();
// bar.cpp
#include "bar.h"
void bar() { A<int> _bar; }
// main.cpp
#include "foo.h"
#include "bar.h"
int main() { foo(); bar(); return 0; }
Tôi nghĩ điều đó xảy ra khi foo()
được gọi vì đây là lần đầu tiên sử dụng A<int>
, vì vậy A<int>
được triển khai tại foo.o
.
Và, khi bar()
được gọi, nó được liên kết với A<int>
tại foo.o
.
Tôi có đúng không? Hoặc instantiation xảy ra hai lần?
Từ quan điểm của trình biên dịch, sự diễn giải sẽ xảy ra trong khi biên dịch 'foo.cpp' và' bar.cpp' một cách riêng biệt. – songyuanyao
@songyuanyao Oh, sau đó rõ ràng instantiation sẽ rẻ hơn một tiềm ẩn? –
Xin lỗi tôi không chắc chắn về nó; cho thời gian biên dịch nó có thể được, cho thời gian chạy nó phải giống nhau. – songyuanyao