C ++ 에서는 네임 스페이스 범위에서 정의하지 않고 정의 const
static
내에서 데이터 멤버 를 정의 할 수 있습니다 class
. 이는 상수가 ODR을 사용하지 않는 한 유효합니다. 이 관행은 번역 단위에서 스토리지 지원을 효과적으로 제공하지 않습니다. 예를 들면 :
#include <cstddef> // std::size_t
class my_string
{
public:
static const auto npos = static_cast<std::size_t>(-1);
};
저는 가능한 경우 거의 항상 자동 인 가이드 라인을 따라 가면서도 일반적인 타이핑을 유지하면서 일관된 왼쪽에서 오른쪽으로 가독성을 달성하는 것을 좋아합니다. 그러나 이것은 실제로 해당 기호가 ODR을 사용하기를 원하는 몇 가지 경우와 상충 됩니다. 내가 것 처럼 할 것은 :
#include "my_string.hpp"
const auto my_string::npos; // error!
그러나이 시점에서 이미 알려진 사실에도 불구하고 유형이 지정되지 않았기 때문에 C ++ 20에서도 실패decltype(my_string::npos)
합니다. 이상적으로는 상수의 유형이 변경 될 때마다 네임 스페이스 정의를 변경할 필요가 없도록하고 싶습니다.
내 질문은 다음과 같습니다. 이러한 시나리오에서 간단한 왼쪽에서 오른쪽으로 구문을 얻을 수있는 방법이 있습니까?
이 문제를 해결하기 위해 내가 생각할 수있는 유일한 두 가지 방법은 c ++ 17 의 변수를 사용하여 네임 스페이스 정의를 지정 하지 않거나 사용 하여 유형 이름을 지정하는 것입니다 (추악하지만 작동 함).inline
decltype(my_string::npos)
decltype (my_string :: npos)이 이미이 시점에 알려져 있음에도 불구하고
글쎄 .. 그냥 사용하세요!
#include <cstddef> // std::size_t
class my_string {
public:
static const auto npos = static_cast<std::size_t>(-1);
};
const decltype(my_string::npos) my_string::npos; // all fine!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다