что на самом деле также отвечает № 1. да, глупо пытаться оптимизировать код, который никогда не будет критичен к производительности, терпеть неудачу при этом, сталкиваться с ошибками компилятора и тратить много часов, пытаясь найти решение, которое слишком многословно и слишком сложно для чтения для производства. : D

я есть следующий код C ++:

#include <array>
#include <iostream>

typedef unsigned char uchar;

class A {
public:
    template <size_t N, uchar value>
    static inline constexpr std::array<uchar, N> filledArray() {
        std::array<uchar,N> ret{};
        ret.fill(value);
        return ret;
    }

    std::array<uchar, 5> upper = A::filledArray<5, 'A'>();
};

int main() {
    A blah;
    for (int i = 0; i < 5; ++i)
        std::cout << blah.upper[i] << std::endl;
    return 0;
}

g ++ компилирует его без предупреждений, и вывод будет как и ожидалось. но clang ++ - 4.0 выдает:

clang++-4.0 -std=c++14 main.cpp -o clangOut
main.cpp:9:47: warning: inline function 'A::filledArray<5, 'A'>' is not defined [-Wundefined-inline]
        static inline constexpr std::array<uchar, N> filledArray() {
                                                    ^
main.cpp:15:34: note: used here
        std::array<uchar, 5> upper = A::filledArray<5, 'A'>();
                                        ^
1 warning generated.
/tmp/main-b6fac8.o: In function `A::A()':
main.cpp:(.text._ZN1AC2Ev[_ZN1AC2Ev]+0x15): undefined reference to `std::array<unsigned char, 5ul> A::filledArray<5ul, (unsigned char)65>()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Кажется, что Clang не видит, что я создаю экземпляр функции fillArray. если я вызываю fillArray с соответствующими аргументами шаблона в основной или любой другой функции, предупреждение исчезает, и clangOut также печатает как ожидалось.

я делаю что-то глупое здесь?GCC версия делает то, что я думаю (инициализировать верхний с как во время компиляции)?это ошибка в Clang?

Ответы на вопрос(1)

Ваш ответ на вопрос