gpt4 book ai didi

C++11模板别名作为模板模板参数导致不同的类型?

转载 作者:IT老高 更新时间:2023-10-28 12:36:27 26 4
gpt4 key购买 nike

我们在以下源代码的编译中观察到一个奇怪的行为:

template<template<class> class TT> struct X { };
template<class> struct Y { };
template<class T> using Z = Y<T>;

int main() {
X<Y> y;
X<Z> z;
z = y; // it fails here
}

这是一个稍加修改的示例,取自 c++11 模板别名标准提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (见第 4 页)另请注意,该提案“将 y 和 z 声明为同一类型”。因此,在我们的解释中,应该可以从 y 分配(或复制构造)z。

但是,此代码不能使用 gcc 4.8.1 和 clang 3.3 编译。这是编译器的错误还是我们误解了标准?

提前致谢,craffael 等人;)

附: Clang 错误信息是:

error: no viable overloaded '='

note: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'X<template Y>' to 'const X<template Z>' for 1st argument
template<template<class> class TT> struct X { };

note: candidate function (the implicit move assignment operator) not viable: no known conversion from 'X<template Y>' to 'X<template Z>' for 1st argument
template<template<class> class TT> struct X { };

最佳答案

目前的标准并没有这么说,但意图是 y 和 z 具有相同的类型。有一个开放的核心工作组问题:http://wg21.cmeerw.net/cwg/issue1286

关于C++11模板别名作为模板模板参数导致不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com