相关疑难解决方法(0)

P0522R0如何破坏代码?

今天我正在阅读clang的C++ 17支持页面.我注意到一些奇怪的事情.功能匹配模板模板参数与兼容参数(P0522R0)标记为部分,因为它必须通过开关激活.他们的笔记:

尽管是缺陷报告的解决方案,但默认情况下,此功能在所有语言版本中都被禁用,并且可以使用Clang 4中的标志-frelaxed-template-template-args显式启用.标准的更改缺少相应的更改对于模板部分排序,导致合理且先前有效的代码的模糊错误.预计这个问题很快就会得到纠正.

激活此功能后会出现什么样的构造?为什么它会破坏代码?

c++ language-lawyer clang++ c++17

16
推荐指数
2
解决办法
491
查看次数

模板模板参数和默认值

请考虑以下代码:

template<typename T>
struct A { };

// same as A, but with one extra defaulted parameter
template<typename T, typename F = int>
struct B { };

template<template<typename> typename T>
T<int> build() { return {}; }

int main()
{
    build<A>();  // works in gcc and clang
    build<B>();  // works in gcc, does not work in clang
}
Run Code Online (Sandbox Code Playgroud)

g ++(7.3.0)编译代码就好了,但是,clang ++(5.0.1)会发出以下命令:

example.cpp:14:5: error: no matching function for call to 'build'
    build<B>();  // works in gcc, does not work in clang
    ^~~~~~~~ …
Run Code Online (Sandbox Code Playgroud)

c++ template-templates variadic-templates c++11 c++17

11
推荐指数
1
解决办法
804
查看次数

模板模板参数不匹配

下面的代码

#include <cstdint>

template<typename  T>
struct allo{};

template <typename T,  std::size_t a  = alignof(T)>
struct AA{
    constexpr std::size_t align() { return a; }
};

template<template <typename> typename AT>
struct SAR{
};

using UHR = SAR<allo>;

using AHR = SAR<AA>;


int main()
{
    UHR u;
    AHR a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

被 GCC 使用 接受-std=c++17,但被 GCC 使用std=c++14和 clang 拒绝(无论 C++ 方言如何)。

https://godbolt.org/z/xaE56Y5Pj

哪个编译器是正确的?这是 C++17 中 clang 尚未实现的一些更改吗?

c++

9
推荐指数
1
解决办法
253
查看次数