«c++17» 태그된 질문

C ++ 17은 2017 년에 승인 된 C ++ 표준의 이름입니다. 이전 C ++ 14 표준을 기반으로하여 핵심 언어 및 표준 라이브러리를 개선하고 몇 가지 새로운 언어 기능을 추가합니다.

1
C ++ 컴파일러는 extern 변수를 어떻게 찾습니까?
이 프로그램을 g ++ 및 clang ++로 컴파일합니다. 차이점은 다음과 같습니다. g ++는 1을 인쇄하지만 clang ++는 2를 인쇄합니다. g ++ : extern varible은 가장 짧은 범위에서 정의 된 것 같습니다 . clang ++ : extern varible은 가장 짧은 전역 범위에서 정의됩니다. C ++ 사양에 대한 사양이 있습니까? main.cpp #include …

1
__func__ 포인터의 두 constexpr 인스턴스의 차이점이 여전히 constexpr입니까?
이것이 유효한 C ++입니까? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC와 MSVC는 괜찮다고 생각하지만 Clang은 그렇지 않다고 생각합니다. 컴파일러 탐색기 . 모든 컴파일러는 이것이 컴파일러 탐색기 라는 것에 동의합니다 . int main() { constexpr auto p = __func__; constexpr auto p2 = p; …

1
std :: gcd의 버그입니까?
나는 std::gcd예기치 않은 것을 발견 한이 행동을 보았습니다 . #include <iostream> #include <numeric> int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type<decltype(a), decltype(b)>::type; C ca = std::abs(a); C cb = b; std::cout << a << …


2
GCC9는 std :: variant의 값없는 상태를 피할 수 있습니까?
최근에 Reddit 토론을 따라 std::visit컴파일러 에서 최적화를 훌륭하게 비교했습니다 . 나는 다음을 발견했다 : https://godbolt.org/z/D2Q5ED GCC9와 Clang9 (모두 동일한 stdlib를 공유한다고 생각합니다)는 모든 유형이 특정 조건을 충족 할 때 가치없는 예외를 확인하고 던지는 코드를 생성하지 않습니다. 이것은 더 나은 codegen으로 이어 지므로 MSVC STL에 문제가 발생 했으며이 코드가 표시되었습니다. template …

1
Clang / Win의 vector <bool> 요소에서 std :: swap이 작동하지 않는 이유는 무엇입니까?
다음과 같은 코드가 있습니다. #include &lt;vector&gt; #include &lt;utility&gt; int main() { std::vector&lt;bool&gt; vb{true, false}; std::swap(vb[0], vb[1]); } vector&lt;bool&gt;제쳐두고 의 정신에 대한 논쟁 , 이것은 잘 작동했습니다 : Mac 용 Clang Windows 용 Visual Studio Linux 용 GCC 그런 다음 Windows에서 Clang을 사용하여 빌드하려고 시도하고 다음과 같은 오류가 발생했습니다. error: no …

1
std :: vector 범위 생성자가 명시 적 변환을 호출 할 수 있습니까?
다음 프로그램이 제대로 구성되어 있습니까? #include &lt;vector&gt; struct A { explicit A(int) {} }; int main() { std::vector&lt;int&gt; vi = {1, 2, 3, 4, 5}; std::vector&lt;A&gt; va(vi.begin(), vi.end()); } C ++ 17 [sequence.reqmts]에 따르면 X u(i, j); X시퀀스 컨테이너는 어디에 있습니까? T한다 EmplaceConstructible에 X에서 *i. 그러나 이전 단락에서는 다음과 같이 …
14 c++  c++17 

3
람다 함수 오버로드
간단한 로컬 람다 함수를 오버로드하는 방법은 무엇입니까? 원래 문제의 SSE : #include &lt;iostream&gt; #include &lt;map&gt; void read() { static std::string line; std::getline(std::cin, line); auto translate = [](int idx) { constexpr static int table[8]{ 7,6,5,4,3,2,1,0 }; return table[idx]; }; auto translate = [](char c) { std::map&lt;char, int&gt; table{ {'a', 0}, {'b', …

1
C ++ nullptr 구현은 어떻게 작동합니까?
어떻게 nullptr작동 하는지 궁금 합니다. 표준 N4659 및 N4849는 다음과 같이 말합니다. 형식이 있어야합니다 std::nullptr_t. 당신은 그 주소를 취할 수 없습니다; 포인터와 멤버에 대한 포인터로 직접 변환 될 수 있습니다. sizeof(std::nullptr_t) == sizeof(void*); 로의 변환 bool은 false; 그것의 값은와 동일하게 정수형으로 변환 될 수 (void*)0있지만, 거꾸로되지는 않는다; 따라서 기본적으로와 같은 …

2
람다에서 static_assert가있는 constexpr이 올바른 컴파일러는 무엇입니까?
static_assert에서 를 사용하려면 if constexpr일부 템플릿 매개 변수에 따라 조건을 만들어야합니다. 흥미롭게도 코드가 람다로 싸여 있으면 gcc와 clang이 동의하지 않습니다. 다음 코드는 gcc로 컴파일되지만 clang은 if constexprtrue 일 수 없더라도 assert를 트리거 합니다. #include &lt;utility&gt; template&lt;typename T&gt; constexpr std::false_type False; template&lt;typename T&gt; void foo() { auto f = [](auto x) …

1
C ++에서 버전간에 표현식 유형이 변경된 이유는 무엇입니까?
C ++ 초안을 이해하기가 어려워서 C ++ 초안을 소화하기가 매우 어려워 다른 리소스를 선호하기 때문에 표현 유형 을 이해하려고 합니다. C ++ 버전 간의 표현 및 정의가 크게 변경되었습니다. 다음에서는 다음과 같은 초안을 참조합니다. C ++ 11 [ n3690 ] (최종 초안) C ++ 17 [ n4659 ] (최종 초안) …
13 c++  c++11  c++14  c++17  c++20 

1
gcc의 모호한 연산자
일부 stl 컨테이너를 인쇄하기위한 함수 템플릿을 만들었습니다. #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; template &lt;template &lt;typename, typename&gt; class C, typename T, typename A&gt; std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const C&lt;T, A&gt;&amp; container) { for (auto&amp; elem : container) { os &lt;&lt; elem &lt;&lt; " "; } return os; } int main() { …
13 c++  c++17 

1
기본 static_vector 구현에서 정의되지 않은 동작
tl; dr : 내 static_vector에 정의되지 않은 동작이 있다고 생각하지만 찾을 수 없습니다. 이 문제는 Microsoft Visual C ++ 17에서 발생합니다.이 간단하고 완료되지 않은 static_vector 구현, 즉 스택 할당이 가능한 고정 용량을 가진 벡터가 있습니다. 이것은 std :: aligned_storage 및 std :: launder를 사용하는 C ++ 17 프로그램입니다. 문제와 관련이 …

2
컴파일 타임에`const char *`유형의 두 문자열을 연결할 수 있습니까?
분명히 constexpr함수 에서 두 개의 문자열 리터럴을 연결할 수 있지만 constexpr아래 코드와 같이 다른 함수에서 반환 된 문자열과 문자열 리터럴을 연결하는 것은 어떻습니까? template &lt;class T&gt; constexpr const char * get_arithmetic_size() { switch (sizeof(T)) { case 1: return "1"; case 2: return "2"; case 4: return "4"; case 8: return …
12 c++  c++17 

1
캡처 할 수없는 람다는 표준에 따라 비어 있습니까?
템플릿 함수에서 다른 람다에서 빈 (캡처가없는) 람다를 식별하는 방법을 찾고 있습니다. 나는 현재 C ++ 17을 사용하고 있지만 C ++ 20 답변도 궁금합니다. 내 코드는 다음과 같습니다 template&lt;typename T&gt; auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr (/* is captureless */) { // do …
12 c++  lambda  c++17  c++20 

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.