[英]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.