写这个函数的正确方法是什么,或者是错误的?

时间:2016-06-07 12:20:25

标签: c++ templates clang++

示例:

#include <string>
#include <array>

template<class T, class...Args>
auto make_array(Args&&...args) -> std::array<T, sizeof...(Args)>
{
    return std::array<T, sizeof...(Args)> {
        T(std::forward<Args>(args))...
    };
}

int main()
{
  auto a = make_array<std::string>("hello", "world");
}

GCC 5.3对它非常满意,即使是-Wpedantic

clang报警:

warning: suggest braces around initialization of subobject [-Wmissing-braces]
        T(std::forward<Args>(args))...
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
        {                          }

如果我遵循clang的自动更正建议,则会产生无法编译的代码。

clang版本:

Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.5.0
Thread model: posix

目前,我已停用带有本地化#pragma的警告。但这非常不令人满意:

template<class T, class...Args>
auto make_array(Args&&...args) -> std::array<T, sizeof...(Args)>
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-braces"
    return std::array<T, sizeof...(Args)> {
        T(std::forward<Args>(args))...
    };
#pragma clang diagnostic pop
}

@牛米。这不是重复的。这是关于如何删除警告的具体问题。 clang的自动更正提供的建议是错误的。

0 个答案:

没有答案