以下代码来自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中哪些段落可能无法实现或尚未实现?
答案 0 :(得分:4)
我认为是
14.5.7别名模板
1 模板声明,其中声明是 alias-declaration (第7条)声明标识符是别名模板。别名模板是一系列类型的名称。别名模板的名称是模板名称。
以上意味着Z
和Y<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()
以上适用于Clang,但不适用于GCC。
编辑:正如@ T.C所指出的那样。有一个活跃的CWG issue 1286表明Clang正在执行标准目前所说的内容,而不是预期的内容。