簡體   English   中英

積分模板參數。 錯誤:在常量表達式中使用'this'

[英]Integral template parameter. error: use of 'this' in a constant expression

我試圖在SO中找到一個類似的回答問題,但沒有成功。 問題是為什么在編譯時使用已知編譯時類型的模板參數的編譯時知道它被認為是錯誤的原因? 常識告訴我,這段代碼可以沒問題。 這種情況有什么問題? 謝謝!

#include <array>

using Cont = std::array<int, 2>;

class A
{
    Cont a_ = {};

public:
    int& at(bool first)
    {
        static_assert(sizeof(a_) / sizeof(int) == 2); // OK
        static_assert(a_.size() > 1); // error: non-constant condition for static assertion. error: use of 'this' in a constant expression
        return a_[first ? 0 : 1];
    }
};

在編譯器資源管理器

更新 :它看起來像dublicate但可能不是因為在鏈接下的問題語音是關於運行時評估,但這里看起來像a_.size()可以在編譯時評估。

UPDATE2更明確的例子(在考慮答案和評論后)

#include <array>

using Cont = std::array<int, 2>;

// OK
void checkSize(const Cont& b)
{
    static_assert(b.size() == 2);
}

class A
{
    Cont a_ = {};

public:
    constexpr void checkSize() const
    {
        Cont b = {};
        static_assert(b.size() == 2); // OK
        static_assert(sizeof(a_) / sizeof(int) == 2); // OK
        static_assert(a_.size() == 2); // error: non-constant condition for static assertion. error: use of 'this' in a constant expression
    }
};

顯示,在這個問題涉及到評估a_.size()。 但是為什么需要它,雖然a_被編譯器稱為非虛擬類型,而size()可以在編譯時進行評估,可能是另一個問題,所以我將檢查第一個答案。

std::array::size ,即使是constexpr函數,也不是static函數。 這意味着它需要調用對象實例。

在這種特殊情況下, at不是constexpr ,因此this也不是_a 由於_a不是constexpr_a.size()的結果_a.size()constexpr

†即使它是,身體仍然不被視為constexpr

a_A類的成員。

a_.size()this->a_.size()的簡化,因為size不是靜態函數,這意味着為了訪問a_ ,你必須訪問this

this是一個指向A類的指針,它不是一個編譯時常量,使你的static_assert失敗。

使用模板可能更容易:

template<int N>
class B {
    std::array<int, N> a_;
    public:
    int& at(bool first)
    {
        static_assert((sizeof(a_) / sizeof(int)) == 2, "Sizeof operator"); // OK
        static_assert(N > 1, "Size method"); // No problem here
        return a_[first ? 0 : 1];
    }

};

暫無
暫無

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

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