Olve Maudal的C ++测验背后的解释(别名模板)

时间:2015-05-14 16:52:06

标签: c++ templates gcc clang alias

以下代码来自http://www.pvv.org/~oma/PubQuiz_ACCU_Apr2014.pdf(#6,第34页的解决方案)。目标是猜测以下输出。

#include <iostream>
template <template <typename> class>
struct X {
    X() { std::cout << "1"; }
};

template<typename >
struct Y {};

template<typename T>
using Z = Y<T>;

template<>
struct X<Y> {
    X() { std::cout << "2"; }
};

int main() {
    X<Y> x1;
    X<Z> x2;
}

答案可以在第34页找到。我不理解别名模板的第二种情况,为什么为X<Z>选择主模板而不是完全专业化。

正确的答案应该是&#34; 21&#34;如在演讲中所写。我的MinGW(gcc 5.1)打印&#34; 22&#34;和http://ideone.com(使用gcc 4.9.2)也打印&#34; 22&#34;。来自MacOS X上的朋友的Clang打印&#34; 21&#34;。所以我猜这是gcc中的一个错误。

任何人都可以向我解释为什么&#34; 1&#34;是为X<Z>打印的,标准gcc中哪些段落可能无法实现或尚未实现?

1 个答案:

答案 0 :(得分:4)

我认为是

  

14.5.7别名模板

     

1 模板声明,其中声明 alias-declaration (第7条)声明标识符别名模板。别名模板是一系列类型的名称。别名模板的名称是模板名称

以上意味着ZY<T>不同模板名称,因此它们是不同的模板。您/编译器可能会混淆的是Z<T>#include <type_traits> template <typename> struct W {}; template <template <typename> class> struct X {}; template<typename> struct Y {}; template<typename T> using Z = Y<T>; int main() { static_assert( std::is_same< Y<int>, Z<int> >::value, "Oops" ); static_assert( std::is_same< W<Y<int>>, W<Z<int>> >::value, "Oops" ); static_assert( ! std::is_same< X<Y>, X<Z> >::value, "Oops" ); } 将始终产生相同的类型。

考虑:

# Inserts data into local database
def insertLocalDB():
    # Open a cursor to perform database operations
    cur = conn.cursor()
    cur.execute("INSERT INTO test_table (buildingID,datetime) VALUES(%s,%s)",
    ("01", datetime))  #HAS TO BE CURRENT DATE AND TIME
    # Make the changes to the database persistant
    conn.commit()
    # Close communication with the database
    cur.close()

Live example

以上适用于Clang,但不适用于GCC。

编辑:正如@ T.C所指出的那样。有一个活跃的CWG issue 1286表明Clang正在执行标准目前所说的内容,而不是预期的内容。