https://issues.dlang.org/show_bug.cgi?id=18558
--- Comment #4 from Jonathan Marler <johnnymar...@gmail.com> --- Maybe a better description... template "alias" parameters can accept "symbols" and "values". If a symbol is passed to the template, i.e. MyTemplate!someSymbol Then the symbol is passed directly to the template without being treated as an expression to evaluate. Even if the symbol is a function, the function is not called and then passed to the template, the function symbol is passed to it. However, if an "non-symbol" expression is passed to the template, then the expression is evaluated at "compile time" and the return value passed to it, i.e. MyTemplate!42 MyTemplate!(40 + 2) enum x = 40; MyTemplate!(x + 2) auto return42() { return 42; } MyTemplate!(return42()) All these represent the same template instantiation. --