簡體   English   中英

const指針作為參數傳遞給constexpr函數

[英]const pointers passed as argument into constexpr function

我正在做一些非常基本的問題,以熟悉模板元編程。 特別是,這僅是將方矩陣的右下對角線上的值相加( [0,0][1,1]等的索引)。 我已經用不同的constexpr函數以多種方式解決了這個問題,但是我不明白為什么一種特殊的方式會失敗。 下面的代碼和錯誤消息:

constexpr int DRsum(const int* starter, const size_t size, int itr = 0)
{
    if(itr==size-1)
    {
        return *starter;
    }
    size_t sum = 0;
    sum = *starter;
    sum += DRsum(starter+size+1, size, itr+1);
    return sum;
}

int main()
{
    static const size_t size = 3;

    static constexpr const int matrix[][size] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
    };

    static constexpr int const* baseptr = &matrix[0][0];

    constexpr int sum = DRsum(baseptr, size);
}

錯誤消息如下:

 main.cpp|69| in constexpr expansion of 'DRsum((& matrix[0][0]), 3u, 0)'| main.cpp|39| in constexpr expansion of 'DRsum((starter + ((((sizetype)size) + 1u) * 4u)), ((size_t)size), (itr + 1))'| main.cpp|69|error: '* starter' is not a constant expression| 

我不確定為什么要這樣做,因為我是Template Metaprogramming的新手。 我做了一個虛擬函數,以測試指針取消引用是否是問題所在,並且效果很好。 我的猜測是,這可能與我傳遞一個指針而不是傳遞給constexpr指針有關,但我不確定。 任何幫助,將不勝感激,謝謝。

此外,我已經通過僅傳入整個結構(直接向上復制一個深拷貝)解決了這個問題,但是我更想知道如何通過淺拷貝或指針將其傳遞給constexpr函數。 謝謝。

2D數組(矩陣)不能視為1D數組,因此starter+size+1導致不確定的行為。 通常,未定義的行為是未定義的,因此程序可以按預期工作,但是當在需要常量表達式的結構內發生未定義的行為時,程序將變得格式錯誤,從而編譯器將產生錯誤。

我不認為有一個簡單的解決方法,因為除非您更改DRsum的簽名,否則就沒有一種明確的方法可以通過starter甚至使用std::launder )訪問整個2D數組。 例如,您可以編寫DRsum ,如下所示:

template <size_t size>
constexpr int DRsum(const int (*starter)[size], int itr = 0)
{
    if (itr == size - 1)
    {
        return (*starter)[itr];
    }
    size_t sum = 0;
    sum = (*starter)[itr];
    sum += DRsum(starter + 1, itr + 1);
    return sum;
}

然后稱其為constexpr int sum = DRsum(matrix);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM