Eclipse CDT 在使用 std::index_sequence 时报告错误

Eclipse CDT is reporting false erros while using std::index_sequence

更新:添加了完整的示例和编译器信息

我有带 CDT 9.7.0.20190309 的 Eclipse 2019-03 (4.11.0),在 C++17 中使用 std::index_sequence 时,内置编译器报告误报错误:

#include <gtest/gtest.h>
#include <utility>
#include <array>

class Sample {
public:
    template<std::size_t N >
    std::size_t get_percentage( void ) {
        return N;
    }

    template<std::size_t... Is>
    inline std::array<std::size_t, sizeof...(Is)> calculate_percentages( std::index_sequence<Is...> ) noexcept {
        return { this->get_percentage<Is>()... };
    }
    template<std::size_t N>
    inline std::array<std::size_t, N> get_percentages( void ) noexcept {
        return this->calculate_percentages( std::make_index_sequence<N>() );
    /*           ^^^^^^^^^^^^^^^^^^^^^ : Invalid arguments ' Candidates are: std::array calculate_percentages(std::integer_sequence) ' */
    }
};

TEST( IntegerSequence, InvalidArgumentsError ) {
    Sample test;
    std::array<std::size_t, 5> data = test.get_percentages<5>();
    for( int i = 0; i < 5; i++ ) {
        std::cout << data[i] << std::endl;
    }
}

int main( int argc, char ** argv ) {
    testing::InitGoogleTest( &argc, argv );
    return RUN_ALL_TESTS();
}

但是正常编译成功没有问题。

我的CDT GCC内置编译器设置中 Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros 等 -> Providers 如下:

${COMMAND} ${FLAGS} -E -P -v -dD -std=c++17 "${INPUTS}"

同样适用于 CDT Cross GCC 内置编译器设置

重建索引并没有帮助。

我使用的 GCC 版本:

gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0

非常感谢任何愿意提供帮助的人...

问题是由于 gcc 8 和更新版本附带的标准库使用一个名为 __integer_pack 的新编译器内部函数来实现 std::make_integer_sequence(以及相关实用程序,如 std::make_index_sequence).

Eclipse CDT 的解析器当前无法理解 __integer_pack 内在函数,因此它无法正确解析使用 std::make_integer_sequence / std::make_index_sequence 的代码以及这些较新的gcc 版本。

filed a CDT bug 跟踪添加对 __integer_pack 内部函数的支持。

同时,您可以采用的解决方法是使用 gcc 7 或更早版本。如果您需要 gcc 8 或更新版本来实际构建您的代码,您仍然可以告诉 Eclipse 查看标准库头文件,例如gcc 7 将上述 "built-in compiler settings" 配置中的 ${COMMAND} 替换为 g++-7.

更新:Eclipse 错误现已修复,修复目标是 CDT 的 9.11 版本(计划成为 Eclipse 2020-03 的一部分)。