I zostały wdrożone constexpr
tablicę tak:Nie można skonstruować constexpr tablicę z usztywnione-init-listy
template <typename T>
class const_array {
const T* p;
unsigned n;
public:
template <unsigned N>
constexpr const_array(const T(&a)[N]): p(a), n(N) { }
constexpr unsigned size() const { return n; }
};
int main(int argc, char* argv[]) {
// works
static_assert(const_array<double>{{1.,2.,3.}}.size() == 3);
// doesn't compile
constexpr const_array<double> a{{1.,2.,3.}};
static_assert(a.size() == 3);
}
Dlaczego jest to, że pierwszy static_assert
kompiluje, ale inicjowanie a
nie używam gcc 6.2? .0. Dostaję
: In function 'int main(int, char**)':
: error: 'const_array<double>{((const double*)(&<anonymous>)), 3u}' is not a constant expression
constexpr const_array<double> a{{1.,2.,3.}};
^
test/const_array.cc:17:3: error: non-constant condition for static assertion
static_assert(a.size() == 3);
^~~~~~~~~~~~~
Zdefiniowałeś 'a' dwa razy. Wygląda na to, że może się zdarzyć niejawna konwersja. Czy otrzymasz jakąkolwiek poprawę, jeśli udekorujesz c'tora w sposób wyraźny? – KyleKnoepfel
@KyleKnoepfel Tworzenie wyraźnego konstruktora nie pomaga. – SU3
'a1' kończy się niepowodzeniem w klangu z' wskaźnikiem do podobiektu tymczasowego nie jest wyrażeniem stałym'. – jbapple