derlemek değildir: kod çalışıyorNeden const referans çalışmaları ile constexpr nesnesini geçen değil değerine göre temelde derleme zamanında bir <code>std::array<></code> içine <code>std::integer_sequence<></code> eşler aşağıdaki kodu var
#include <iostream>
#include <utility>
#include <array>
template<int...Is>
constexpr auto make_array(const std::integer_sequence<int, Is...>& param) // this works */
// constexpr auto make_array(std::integer_sequence<int, Is...> param) // doesn't compile
{
return std::array<int, sizeof...(Is)> {Is...};
}
int main()
{
constexpr std::integer_sequence<int, 1,2,3,4> iseq;
// If I pass by value, error: the value of 'iseq' is not usable in a constant expression
constexpr auto arr = make_array(iseq);
for(auto elem: arr)
std::cout << elem << " ";
}
zaman make_array
argümanını const
-referansı ile alır. Neden bu
error: the value of 'iseq' is not usable in a constant expression
constexpr auto arr = make_array(iseq);
: Ben yorumladı doğrultusunda gibi değeri geçirmeden deneyin zaman, bu bir hata tükürür? Parametre iseq
kesinlikle sabit bir ifadesidir, neden make_array
bunu geçemez?
#include <iostream>
#include <utility>
struct Foo
{
int _m;
constexpr Foo(int m): _m(m){};
};
constexpr Foo factory_foo(int m)
{
return Foo{m};
}
constexpr Foo copy_foo(Foo foo)
{
return foo;
}
int main()
{
constexpr Foo cxfoo = factory_foo(42);
constexpr Foo cpfoo = copy_foo(cxfoo);
}
DÜZENLEME MacPorts g ++ 5.1 kullanıyorum
: değeriyle geçen beklendiği gibi
Örneğin, kod aşağıdaki çalışır. clang ++ 3.5 kullanarak, ben bile (const
atfen) ++ g ile derler kodu için bir hata mesajı alıyorum:
error: default initialization of an object of const type 'const std::integer_sequence' requires a user-provided default constructor
yüzden bir kullanıcı tarafından sağlanan varsayılan kurucu eksikliği ile bazı sorun vardır sanırım, ama en bu noktada neler olup bittiğini anlamıyorum.
derleyici (ler) ve sürüm (ler). –
@ShafikYaghmour g ++ 5.1, yakında clang üzerinde çalışacağız. Güncellenmiş düzenlemeye bakın, clang ++ 'const' referansıyla iletme durumunda bile bir hata yapıyor. Muhtemelen varsayılan ifadeler hakkında sabit ifadelerde bir şey eksik. – vsoftco