I have a template class which takes as its first template argument a foo * pointer. I\'d like to instantiate one of these with a foo located at an absolute address, like so:
From the C++11 Standard (emphasis mine):
14.3.2 Template non-type arguments
1 A template-argument for a non-type, non-template template-parameter shall be one of:
— for a non-type template-parameter of integral or enumeration type, a converted constant expression (5.19) of the type of the template-parameter; or
— the name of a non-type template-parameter; or
— a constant expression (5.19) that designates the address of an object with static storage duration and external or internal linkage or a function with external or internal linkage, including function templates and function template-ids but excluding non-static class members, expressed (ignoring parentheses) as
&
id-expression, except that the&
may be omitted if the name refers to a function or array and shall be omitted if the corresponding template-parameter is a reference; or— a constant expression that evaluates to a null pointer value (4.10); or
When compiled with g++ -Wall
, I get the following error:
error: ‘2148545536u’ is not a valid template argument for ‘foo*’ because it is not the address of a variable
bar myFoo; // fails with non-integral argument
^
It seems that the compiler is able to detect that 0x80103400
is not the address of a variable, it's just a constant expression.