c++ - 在可变参数模板中使用 lambda 调用 std::make_tuple - 这应该在 C++11 中工作吗?

标签 c++ c++11 tuples variadic-templates lambda

在 C++11 中,lambda 函数是一个对象,应该可以用它调用 make_tuple,对吗?

void foobar() {
    auto t = std::make_tuple([](){ std::make_shared<int>(); });
}

这段代码对我有用。

现在如果我们添加可变参数模板会发生什么:

#include <tuple>
#include <memory>

template <class... T>
void foobar() {
    auto t = std::make_tuple([](){ std::make_shared<T>(); }...);
}

int main(int, char**)
{
    foobar<int, float, double>();
    return 0;
}

这个无法在 GCC 4.7.2 中编译

main.cpp: In lambda function:
main.cpp:6:54: error: parameter packs not expanded with '...':
main.cpp:6:54: note:         'T'
main.cpp: In function 'void foobar()':
main.cpp:6:57: error: expansion pattern '#'lambda_expr' not supported by dump_expr#<expression error>' contains no argument packs
main.cpp: In instantiation of 'void foobar() [with T = {int, float, double}]':
main.cpp:11:29:   required from here

我想知道,这段代码是否符合标准?

最佳答案

这是 gcc 中的一个已知错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41933 (最初的例子是一个不同的模式,涵盖了参数包的捕获,但潜在的问题和合并的错误是 gcc 根本没有实现 lambdas 和 variadics 的交集)。

就标准而言,它是完全可以接受的代码。

关于c++ - 在可变参数模板中使用 lambda 调用 std::make_tuple - 这应该在 C++11 中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13469851/

相关文章:

c++ - Qt 的 pragma 指令

c++ - 使用库中的抽象类时如何解决 "deep copy of an abstract class"问题?

C++11/模板 : Select the correct overloading of a function

python - 输入空 __slots__ (或空元组)的规范方法是什么?

c++ - 使用 OpenCV 在交叉点画线

c++ - 从被调用者的角度来看,如何检测内存是动态的还是静态的?

c++ - 这可以用静态类型来完成吗?

具有非静态成员初始化器的类的 C++11 聚合初始化

python - 奇怪的内联赋值

c++ - 使用参数包和元组创建一个简单的表达式类