gpt4 book ai didi

c++ - Variadic 模板错误 -- MSVS2013 编译,clang-3.5 不编译

转载 作者:行者123 更新时间:2023-11-30 03:49:43 25 4
gpt4 key购买 nike

下面的代码可以在 MSVC 2013 中正常编译和运行,但不能在 clang++3.6 中正常运行。哪个编译器是正确的?

MSVC 2013 编译并执行代码,打印26.04:

#include <iostream>

template <typename T, typename ... U>
auto mul(T t, U ... u) -> decltype(t * mul(u ...))
{
return t * mul(u ...);
}

template <typename T>
T mul(T t) { return t; }

int main()
{
std::cout << mul(2., 3.1, 4.2) << std::endl;
}

但是,使用 clang++-3.6 编译会产生错误:

$ clang++ test.cpp -stdlib=libc++ -Wall -Wextra -std=c++14 
prog.cc:14:15: error: no matching function for call to 'mul'
std::cout << mul(2., 3.1, 4.2) << std::endl;
^~~
prog.cc:4:6: note: candidate template ignored: substitution failure [with T = double, U = <double, double>]: use of undeclared identifier 'mul'
auto mul(T t, U ... u) -> decltype(t * mul(u ...))
^ ~~~
prog.cc:10:3: note: candidate function template not viable: requires single argument 't', but 3 arguments were provided
T mul(T t) { return t; }
^
1 error generated.

mul的声明是不是不能确定返回typedecl?

最佳答案

首先,如果您将 main 中的调用替换为 mul(2., 3.1) (两个参数),您的代码仍然无法在 Clang 和 GCC 中编译.但在这种情况下,它不会编译,因为您的单参数 mul 是在多参数版本之后声明的。单参数版本在多参数版本的声明点尚不清楚。如果将单参数声明移到顶部,mul(2., 3.1) 调用将编译。它编译是因为返回类型规范 decltype(t * mul(u ...)) 引用了一个已经完全声明的 mul 单参数版本。

其次,带有三个参数的原始调用 mul(2., 3.1, 4.2) 无法编译,因为它试图通过自身递归声明其返回类型(通过双参数版本,这仍然指的是同一个模板)。这是不允许的。是的,我们都知道递归是定义明确的,最终会触底,但语言不允许这样做。 (仍在寻找正式报价...)

关于c++ - Variadic 模板错误 -- MSVS2013 编译,clang-3.5 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291580/

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