It is sufficient to have name and type. There is no need for the result
"to know" what exact expression was used to define the column.
Surprisingly, template alias creates new templates (in contrast to
non-template using, which really just creates an alias of a type).
template<typename T> struct A{};
struct X
{
template<typename T>
using U = A<T>;
};
struct Y
{
template<typename T>
using U = A<T>;
template<>
using U<int> = X;
};
template<template<typename> class X>
struct Z{};
static_assert(std::is_same<X::U<int>, Y::U<int>>::value, "class aliases are really just aliases");
static_assert(not std::is_same<Z<X::U>, Z<Y::U>>::value, "template aliases are new templates");
int main()
{
}
result_row objects can be constructed with raw result rows representing
the end of the result set. Field values must not be accessed for such
rows. Thus, is_null() now throws an exception when called for a field of
an invalid row.