내가 질문을 변경 한 이래서 이것은 my previous post의 말씨입니다. (아마도 새로운 질문으로 표시되지 않고 놓친 것 같습니다.) 나는 그것을 잘게 잘랐다. 배열은 조건부 연산자와 어떻게 작동합니까?
나는 기능을 좋아했다 :remove_some_extents
가
std::remove_extent
메타 기능 지정된 횟수를 호출처럼 사용자 정의 클래스 템플릿입니다
#include <cstddef>
#include <type_traits>
template < typename E, typename T >
inline constexpr
auto checked_slice(E &&, T &&t) noexcept -> T &&
{ return static_cast<T &&>(t); }
template < typename E, typename T, std::size_t N, typename U, typename ...V >
inline constexpr
auto checked_slice(E &&e, T (&t)[N], U &&u, V &&...v)
-> typename remove_some_extents<T, sizeof...(V)>::type &
{
typedef typename std::remove_reference<U>::type u_type;
typedef typename std::common_type<u_type, std::size_t>::type cmp_type;
return (u < u_type{}) || (static_cast<cmp_type>(u) >=
static_cast<cmp_type>(N)) ? throw e : checked_slice(static_cast<E &&>(e),
t[static_cast<U &&>(u)], static_cast<V &&>(v)...);
}
. "유형 Whatever(*)[Y]
의 표현에서 유형 Whatever(&)[X][Y]
의 참조의 잘못된 초기화"(또는 Whatever*
에서 Whatever(&)[Z]
) : 나는이 프로그램을 실행했을 때
if
-
else
쌍으로 변환 한 다음
constexpr
을 제거하는 것입니다.
나는 무엇이 잘못되었는지 알아 내려고 노력하고 있으므로 C++ (2011) 표준의 조건부 연산자에 대한 섹션을 살펴 보겠습니다. 그건 5.16 절입니다. 두 가지 가능한 동작 중 하나가 throw 명령이거나 그렇지 않으면 void
표현식 인 경우 조건부는 다른 표현식 유형을 갖지만 배열 대 포인터를 포함한 표준 변환이 다른 표현식에 적용됩니다. (2 단락에 나와 있습니다.) 그게 나를 망쳐 놓는 것 같아. 그 주위에 어떤 방법이 있습니까? 나는 배열 참조를 반환하는 것이 a-to-p 변환을 억제한다고 생각했다. if/else
으로 만들면 왜 작동합니까?
컴파일러 웹 페이지에서 테스트 할 때 괄호가 필요하지 않습니다! '? :'에 대한 문법은'LOGICAL_OR_EXPR? EXPR : ASSIGN_EXPR'. 세 번째 섹션은 쉼표 연산자를 제외한 모든 것일 수 있습니다. 두 번째 섹션은 그 제한이 없습니다 * 없습니다 *! (첫번째 섹션은'? :'보다 높은 우선 순위를 가진 것입니다.) – CTMacUser
괄호는 컴파일러의 이익을위한 경우는 거의 없습니다. –
답변이 효과적이었습니다. 커밋 SHA 66ca088332dd1e57fdaf9e90749105224c301afb, 줄 136에서 159까지 [코드] (https://github.com/CTMacUser/ArrayMD/blob/master/include/boost/utility/slice.hpp)를 볼 수 있습니다. – CTMacUser