【发布时间】:2017-06-23 17:12:42
【问题描述】:
我发现下面这段代码:
#include <iostream>
#include <vector>
template <typename T>
struct X : std::false_type {};
template <template <typename> class Y, typename U>
struct X<Y<U>> : std::true_type {};
int main() {
if (X<int>())
std::cout << "wrong\n";
if (X<std::vector<double>>())
std::cout << "correct\n";
return 0;
}
仅在使用g++-7 和-std=c++1z 编译时打印correct。其他版本的g++、clang++ 或其他std 标志无法正确生成。
这是当前实现的一个错误,并且这段代码不应该打印任何东西,还是在 C++17 中发生了一些变化,使得这段代码可以按我的预期工作?
【问题讨论】:
-
有趣的事实:如果你让
Y接受可变数量的参数,它将在-std=c++1z上为clang 打印correct而在-std=c++17上为gcc 打印任何内容:) -
仍然在此处打印
correct和g++-7..
标签: c++ templates g++ c++17 clang++