jeudi 3 août 2017

in which case, c++ will do array bounds checking at compiling time

Inspired by the idea of "C++ HTML template engine that uses compile time HTML parsing", I am trying to write a sample class to check whether the first char is 'a' in a string.

int dummy[0];
class Test
{
public:
    constexpr Test(const char *p):p_(p){}
    constexpr void check()const
    {
        if (p_[0]!='a')
            dummy[1]=0;
    }
    const char *p_;
};


constexpr Test operator"" _test(const char *pszText, size_t)
{
  Test t(pszText);
  t.check();
  return t;
}


int main()
{
    //dummy[1] = 0;
    constexpr Test t = "baa"_test;
}

It works well. If the first char is not 'a', it will give a compile error:

main.cpp:29:24: error: array subscript value ‘1’ is outside the bounds of array ‘dummy’ of type ‘int [0]’ constexpr Test t = "baa"_test;

What confused me is that if I change the code to:

int main()
{
    dummy[1] = 0; //no compile error anymore
}

I am wondering when c++ will report array out of bounds error.

Aucun commentaire:

Enregistrer un commentaire