Supõe-se que, de acordo com as informações que ouvi, se você tiver uma variável como:
inline int a_var;
ou
struct Foo
{
static inline int a_var;
};
Em um arquivo de cabeçalho e inclua esse cabeçalho em algum lugar em uma biblioteca estática, library2, e então inclua-o em uma biblioteca, Library2, então cada biblioteca terá sua própria cópia dessa variável.
Então eu testei isso. Eu fiz um executável e vinculei à Biblioteca estática 1 e à Biblioteca estática2.
Declaro uma variável em uma struct em um cabeçalho comum:
struct MyStruct
{
static inline int static_var = 0;
};
E no meu executável/main() eu faço:
void library_one_function();
void library_two_function();
#include "common_header.h"
#include <iostream>
int main()
{
MyStruct::static_var = 1;
std::cout << "Value from executable = " << MyStruct::static_var << "\n"; // I GET 1
library_one_func(); // LIBRARY ONE FUNCTION CHANGES IT TO 7
std::cout << "Value from executable = " << MyStruct::static_var << "\n"; // I GET 7
library_two_function(); // LIBRARY TWO FUNCTION CHANGES IT TO 100
std::cout << "Value from executable = " << MyStruct::static_var << "\n"; // I GET 100
}
Toda vez que eu referencio essa variável, não há nenhuma indicação de que cada biblioteca tem sua própria cópia. É sempre a mesma coisa. Por que então as pessoas dizem que as variáveis inline têm suas próprias cópias?
C++ não diz.
C++ reconhece a possibilidade de bibliotecas separadas de compilação e pré-compiladas, mas não prescreve nenhum detalhe e não permite que seu uso afete o comportamento ou a semântica de programas C++ bem formados. O envolvimento e as características das bibliotecas são um detalhe de implementação que não é relevante para a semântica C++.
Se, em uma determinada implementação, várias bibliotecas estáticas obtivessem suas próprias cópias de
static
inline
membros de dados, seria responsabilidade do vinculador dessa implementação fazer o que fosse necessário para garantir que a especificação C++ que...(classe.static.data; C23 11.4.9.3/1)
... é satisfeito. Isso pode ser mesclando várias cópias em uma de alguma forma apropriada, recusando-se a vincular se houvesse um conflito, ou talvez por algum outro meio.
Qualquer pessoa bem informada dizendo isso e pretendendo ser interpretada como você está fazendo, que tal duplicação poderia ser visível dentro de um programa C++, está comentando sobre possíveis caminhos para a não conformidade da implementação. É improvável que isso seja observado com implementações típicas de bibliotecas estáticas. Talvez haja mais risco com algumas implementações de bibliotecas compartilhadas, mas isso é, novamente, um detalhe da implementação.
Nota adicional
Nos comentários, você citou algumas observações que atribuiu a Raymond Chen, a respeito de uma situação diferente, sobre a qual você disse:
Isso diz respeito a uma variável local estática de uma função inline, não uma variável inline estática como nos exemplos da sua pergunta. Em todo caso, embora a especificação possa ter sido pouco clara sobre isso na época em que tal incerteza foi expressa, versões recentes contêm uma nota esclarecendo que (versão C++23):
(dcl.inline; C++23 9.2.8/6)
Portanto, a semântica necessária é análoga: há apenas uma cópia da variável local estática no que diz respeito ao comportamento e à semântica do C++, independentemente de a função ser definida em linha ou não, independentemente de quantas ou que tipo de bibliotecas estejam envolvidas.
Nota adicional adicional
Você pode, é claro, simplesmente evitar membros de dados estáticos inline, e talvez também variáveis locais estáticas de funções inline. Membros de dados estáticos não inline (que são acessados) devem ter exatamente uma definição -- então não em um cabeçalho -- e é necessário e relativamente fácil garantir que isso não seja duplicado.