================================================
|
|
template functions vs relational expressions
|
|
================================================
|
|
|
|
T1 a = b < c > d;
|
|
T2 e = f<T3>(g);
|
|
int a = std::get<0>(t);
|
|
if (x.y < z) break; // Not a template missing a '>'
|
|
if (x.y < x->y && x.y > 50) break;
|
|
if (x.foo < 0 || bar >= 1) break;
|
|
if (x.Base::foo < 0 || bar >= 1) {
|
|
bool i = x.Base::foo < 0 || 1 > (5); // No way to tell
|
|
}
|
|
|
|
---
|
|
|
|
(translation_unit
|
|
(declaration
|
|
(type_identifier)
|
|
(init_declarator
|
|
(identifier)
|
|
(binary_expression
|
|
(binary_expression (identifier) (identifier))
|
|
(identifier))))
|
|
(declaration
|
|
(type_identifier)
|
|
(init_declarator
|
|
(identifier)
|
|
(call_expression
|
|
(template_function (identifier) (template_argument_list
|
|
(type_descriptor (type_identifier))))
|
|
(argument_list (identifier)))))
|
|
(declaration
|
|
(primitive_type)
|
|
(init_declarator
|
|
(identifier)
|
|
(call_expression
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(template_function
|
|
(identifier)
|
|
(template_argument_list (number_literal))))
|
|
(argument_list (identifier)))))
|
|
(if_statement
|
|
(condition_clause
|
|
(binary_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(identifier)))
|
|
(break_statement))
|
|
(comment)
|
|
(if_statement
|
|
(condition_clause
|
|
(binary_expression
|
|
(binary_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier)))
|
|
(binary_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(number_literal))))
|
|
(break_statement))
|
|
(if_statement
|
|
(condition_clause
|
|
(binary_expression
|
|
(binary_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(number_literal))
|
|
(binary_expression
|
|
(identifier)
|
|
(number_literal))))
|
|
(break_statement))
|
|
(if_statement
|
|
(condition_clause
|
|
(binary_expression
|
|
(binary_expression
|
|
(field_expression
|
|
(identifier)
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(field_identifier)))
|
|
(number_literal))
|
|
(binary_expression
|
|
(identifier)
|
|
(number_literal))))
|
|
(compound_statement
|
|
(declaration
|
|
(primitive_type)
|
|
(init_declarator
|
|
(identifier)
|
|
(binary_expression
|
|
(binary_expression
|
|
(field_expression
|
|
(identifier)
|
|
(qualified_identifier
|
|
(namespace_identifier)
|
|
(field_identifier)))
|
|
(number_literal))
|
|
(binary_expression
|
|
(number_literal)
|
|
(parenthesized_expression
|
|
(number_literal))))))
|
|
(comment))))
|
|
|
|
=================================================
|
|
function declarations vs variable initializations
|
|
=================================================
|
|
|
|
// Function declarations
|
|
T1 a(T2 *b);
|
|
T3 c(T4 &d, T5 &&e);
|
|
|
|
// Variable declarations with initializers
|
|
T7 f(g.h);
|
|
T6 i{j};
|
|
|
|
---
|
|
|
|
(translation_unit
|
|
(comment)
|
|
(declaration
|
|
(type_identifier)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list (parameter_declaration (type_identifier) (pointer_declarator (identifier))))))
|
|
(declaration
|
|
(type_identifier)
|
|
(function_declarator
|
|
(identifier)
|
|
(parameter_list
|
|
(parameter_declaration (type_identifier) (reference_declarator (identifier)))
|
|
(parameter_declaration (type_identifier) (reference_declarator (identifier))))))
|
|
|
|
(comment)
|
|
(declaration
|
|
(type_identifier)
|
|
(init_declarator
|
|
(identifier)
|
|
(argument_list (field_expression (identifier) (field_identifier)))))
|
|
(declaration
|
|
(type_identifier)
|
|
(init_declarator
|
|
(identifier)
|
|
(initializer_list (identifier)))))
|
|
|
|
================================================
|
|
template classes vs relational expressions
|
|
================================================
|
|
|
|
int main() {
|
|
T1<T2> v1;
|
|
T1<T2> v2 = v3;
|
|
}
|
|
|
|
---
|
|
|
|
(translation_unit (function_definition
|
|
(primitive_type)
|
|
(function_declarator (identifier) (parameter_list))
|
|
(compound_statement
|
|
(declaration
|
|
(template_type (type_identifier)
|
|
(template_argument_list (type_descriptor (type_identifier))))
|
|
(identifier))
|
|
(declaration
|
|
(template_type (type_identifier)
|
|
(template_argument_list (type_descriptor (type_identifier))))
|
|
(init_declarator (identifier) (identifier))))))
|