2013-06-27 14 views
6

Dlaczego używanie zmiennej lokalnej jako argumentu innego niż nie jest możliwe?zmienna lokalna jako argument inny niż nazwa pliku

Na przykład w następnym kodzie local_var nie można argumentować na X.

template<int& x> struct X {}; 

void f(int local_var) 
{ 
    X<local_var> x; 
} 
+1

Argumenty szablonu są częścią * typu *. Jaki byłby typ "x" w twoim przykładzie? –

Odpowiedz

6

Ponieważ argumenty szablonu musi być oceniana w czasie kompilacji, a kompilator nie będzie znać adres zmiennej lokalnej aż okresie czasu (w celu związania odniesienie do obiektu, kompilator musi znać adres tego obiektu).

Zauważmy, że C++ 11 Standardowe mówi dokładnie to, co non typu argumenty szablon może być dostarczony w pkt 14.3.2/1:

szablon argumentem dla non-type, bezmatrycowej szablonu parametr powinien być:

- dla nie typu szablon parametru integralnego lub wyliczania typu przekształcony stałej ekspresji (5,19) typu matrycy -parametr; lub

- nazwa parametru szablonu non-type; lub

- wyrażenie stałe (5,19), który wyznacza adres obiektu ze statycznymi czas przechowywania i zewnętrznym lub wewnętrznym wiązaniem lub funkcji z zewnętrznym lub wewnętrznym wiązaniem zawierający wzory funkcyjnych i funkcja szablon identyfikatory ale Wykluczając statycznych klasy wyrażona (pomijając w nawiasach), a & id ekspresji, z tym że & może być pominięty, jeśli nazwa odnosi się do funkcji lub szeregu oraz być pominięte, jeżeli odpowiedni szablon parametr jest odniesienie; lub

- stałe wyrażenie, które zwraca wartość wskaźnika pustego (4.10); lub

- stałe wyrażenie, które zwraca wartość wskaźnika elementu zerowego (4.11); lub

- wskaźnik do elementu wyrażony w sposób opisany w 5.3.1; lub

- stałe wyrażenie adresu typu std::nullptr_t.

Jak widać, zmiennych lokalnych nie ma na tej liście.

+0

Czekaj, ale możesz przekazać funkcje jako argumenty szablonów, a kompilator nie zna adresów tych aż do uruchomienia. – Mehrdad

+1

@Mehrdad: Nie jestem pewien, czy podążam za tobą. Dlaczego adres funkcji byłby znany tylko w czasie wykonywania? –

+2

@Mehrdad: Zmienne "lokalne" (blokowe) są wyraźnie wykluczone przez trzeci punkt, cytowany przez Andy'ego, ponieważ nie mają powiązania. Zobacz http://stackoverflow.com/questions/17348611/does-static-object-in-a-template-function-have-linkage/17350254#17350254 – rici

0

"Wartość" szablonu musi być obecna podczas kompilacji.

template<int x> struct X {}; 

Nawet jeśli nie wiążemy odniesienia lub nie podajemy tutaj wskaźnika, kompilator musi znać wartość przekazanych elementów podczas kompilacji.

Zastępowanie int &x z int x jest tutaj celowe. Rzeczy o int & jest poprawnie odpowiedziała. Chciałem tylko wskazać, że ma on zastosowanie do wszystkich nieopisanych argumentów szablonu.

  • „Wartość” z odniesieniem jest odniesienie (realizacja uzależniona rzeczywiście wskaźnik w większości z nich)
    • adres obiektu muszą być znane w czasie kompilacji
  • The " wartość "wskaźnika template<int*> to adres ...
    • ... co z kolei musi oczywiście być również znane tutaj.
  • „Wartość” danego typu jest wartością sama w sobie, która również musi być znany w czasie kompilacji

 

X<local_var> x; // will not work, local_var does not exist at compile time 
X<1> x; // works since 1 is known 

Chciałem tylko (oprócz Andy odpowiedź), aby uniknąć jakichkolwiek wniosków, które sugerowałyby użycie typu wartości zamiast odniesienia.

+0

'szablon ' jest nieco inny od 'szablonu '. – aschepler

+0

Dziękuję za odpowiedź, ale jak wspominałeś, interpretujesz szablon zamiast szablonu

+0

Oboje macie rację i to jest celowe. Będę szybko edytować. – Pixelchemist

Powiązane problemy