Примечание. Исходная проблема сильно использует макросы, но для этого вопроса была упрощена.
Вопрос
// header.hpp
template <typename T>
void foo()
{
someBoolean = true ; // at this point "someBoolean" wasn't
} // declared
Затем он используется в следующем источнике:
// source.cpp
#include "header.hpp"
static bool someBoolean = false ;
void bar()
{
foo<char>() ; // here, we call/instantiate the function
}
В некоторых компиляторах (Windows, предыдущий Solaris) он работает. И в текущем компиляторе Solaris, поддерживающем С++ 11, он терпит неудачу, говоря, что someBoolean - это undefined.
В соответствии со стандартом, может ли шаблонный код использовать переменную, которая будет (мы надеемся!) объявлена позже в источнике?
Бонусный вопрос
Шаблон определен в заголовке, который, как ожидается, будет включен в несколько источников, каждый из которых имеет свою собственную логическую переменную и создает экземпляр шаблона.
Ожидалось, что в каждой единицы перевода шаблон повлияет на статическую булевую переменную этой единицы перевода.
Каждое создание шаблона на одном типе (скажем, "char" ), как ожидается, повлияет на разные переменные.
Не полагаемся ли мы на поведение undefined?