Senin, 18 Maret 2019

Vector of pair with const member





















7






























As stated in this answer a std::vector<T> cannot contain const T, or classes with const-members. However, this is not the case when T = std::pair<const int, int>, as shown below. Why is this the case? How is std::pair special?



#include <utility>

#include <vector>



struct foo

{

const int first;

int second;

};



int main() {

std::vector<std::pair<const int, int>> V1;

V1.resize(3); // This compiles



std::vector<foo> V2;

V2.resize(3); // This gives the error listed below

}




error: use of deleted function 'foo::foo()'



note: 'foo::foo()' is implicitly deleted because the default definition would be ill-formed:


















share|improve this question







































  • 1











    You linked to a Q&A about C++03. Not saying it's necessarily irrelevant, but a lot has been tweaked in the C++ standard since.



    – StoryTeller

    1 hour ago






























7






























As stated in this answer a std::vector<T> cannot contain const T, or classes with const-members. However, this is not the case when T = std::pair<const int, int>, as shown below. Why is this the case? How is std::pair special?



#include <utility>

#include <vector>



struct foo

{

const int first;

int second;

};



int main() {

std::vector<std::pair<const int, int>> V1;

V1.resize(3); // This compiles



std::vector<foo> V2;

V2.resize(3); // This gives the error listed below

}




error: use of deleted function 'foo::foo()'



note: 'foo::foo()' is implicitly deleted because the default definition would be ill-formed:


















share|improve this question







































  • 1











    You linked to a Q&A about C++03. Not saying it's necessarily irrelevant, but a lot has been tweaked in the C++ standard since.



    – StoryTeller

    1 hour ago


























7






















7














7


1










As stated in this answer a std::vector<T> cannot contain const T, or classes with const-members. However, this is not the case when T = std::pair<const int, int>, as shown below. Why is this the case? How is std::pair special?



#include <utility>

#include <vector>



struct foo

{

const int first;

int second;

};



int main() {

std::vector<std::pair<const int, int>> V1;

V1.resize(3); // This compiles



std::vector<foo> V2;

V2.resize(3); // This gives the error listed below

}




error: use of deleted function 'foo::foo()'



note: 'foo::foo()' is implicitly deleted because the default definition would be ill-formed:


















share|improve this question






























As stated in this answer a std::vector<T> cannot contain const T, or classes with const-members. However, this is not the case when T = std::pair<const int, int>, as shown below. Why is this the case? How is std::pair special?



#include <utility>

#include <vector>



struct foo

{

const int first;

int second;

};



int main() {

std::vector<std::pair<const int, int>> V1;

V1.resize(3); // This compiles



std::vector<foo> V2;

V2.resize(3); // This gives the error listed below

}




error: use of deleted function 'foo::foo()'



note: 'foo::foo()' is implicitly deleted because the default definition would be ill-formed:









c++ vector language-lawyer










share|improve this question



























share|improve this question























share|improve this question





share|improve this question










edited 1 hour ago













Usman



1,090717







1,090717















asked 1 hour ago













JonasJonas



5,87682444







5,87682444














  • 1











    You linked to a Q&A about C++03. Not saying it's necessarily irrelevant, but a lot has been tweaked in the C++ standard since.



    – StoryTeller

    1 hour ago

























  • 1











    You linked to a Q&A about C++03. Not saying it's necessarily irrelevant, but a lot has been tweaked in the C++ standard since.



    – StoryTeller

    1 hour ago














1







1









You linked to a Q&A about C++03. Not saying it's necessarily irrelevant, but a lot has been tweaked in the C++ standard since.



– StoryTeller

1 hour ago









You linked to a Q&A about C++03. Not saying it's necessarily irrelevant, but a lot has been tweaked in the C++ standard since.



– StoryTeller

1 hour ago



















1 Answer

1











active



oldest



votes





































13




























You are mixing two things here. The error that you get is due to the implicitly deleted foo() default constructor that std::vector::resize(size_type count) invokes:




If the current size is less than count,

1) additional default-inserted elements are appended




The std::pair template has a default constructor, this is why the call to V1.resize succeeds. If you provide one for foo as well, or allow its implicit generation by in class initialization, e.g.



struct foo

{

const int first = 42;

int second = 43;

};



then



std::vector<foo> V2;

V2.resize(3);



will happily compile. The operation that won't work out for both std::pair<const int, int> and foo is assignment. This won't compile:



V1[0] = std::pair<const int, int>(42, 43); // No way

V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member



which doesn't have anything to do with std::vector, but with the const-qualified data members in both cases.









share|improve this answer



















































  • Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



    – StoryTeller

    49 mins ago























  • @StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



    – lubgr

    37 mins ago






















Your Answer











StackExchange.ifUsing("editor", function () {

StackExchange.using("externalEditor", function () {

StackExchange.using("snippets", function () {

StackExchange.snippets.init();

});

});

}, "code-snippets");



StackExchange.ready(function() {

var channelOptions = {

tags: "".split(" "),

id: "1"

};

initTagRenderer("".split(" "), "".split(" "), channelOptions);



StackExchange.using("externalEditor", function() {

// Have to fire editor after snippets, if snippets enabled

if (StackExchange.settings.snippets.snippetsEnabled) {

StackExchange.using("snippets", function() {

createEditor();

});

}

else {

createEditor();

}

});



function createEditor() {

StackExchange.prepareEditor({

heartbeatType: 'answer',

autoActivateHeartbeat: false,

convertImagesToLinks: true,

noModals: true,

showLowRepImageUploadWarning: true,

reputationToPostImages: 10,

bindNavPrevention: true,

postfix: "",

imageUploader: {

brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",

contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",

allowUrls: true

},

onDemand: true,

discardSelector: ".discard-answer"

,immediatelyShowMarkdownHelp:true

});





}

});




























draft saved


draft discarded



































StackExchange.ready(

function () {

StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55218505%2fvector-of-pair-with-const-member%23new-answer', 'question_page');

}

);



Post as a guest




























Required, but never shown














































1 Answer

1











active



oldest



votes















1 Answer

1











active



oldest



votes

















active



oldest



votes











active



oldest



votes

















13




























You are mixing two things here. The error that you get is due to the implicitly deleted foo() default constructor that std::vector::resize(size_type count) invokes:




If the current size is less than count,

1) additional default-inserted elements are appended




The std::pair template has a default constructor, this is why the call to V1.resize succeeds. If you provide one for foo as well, or allow its implicit generation by in class initialization, e.g.



struct foo

{

const int first = 42;

int second = 43;

};



then



std::vector<foo> V2;

V2.resize(3);



will happily compile. The operation that won't work out for both std::pair<const int, int> and foo is assignment. This won't compile:



V1[0] = std::pair<const int, int>(42, 43); // No way

V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member



which doesn't have anything to do with std::vector, but with the const-qualified data members in both cases.









share|improve this answer



















































  • Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



    – StoryTeller

    49 mins ago























  • @StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



    – lubgr

    37 mins ago






























13




























You are mixing two things here. The error that you get is due to the implicitly deleted foo() default constructor that std::vector::resize(size_type count) invokes:




If the current size is less than count,

1) additional default-inserted elements are appended




The std::pair template has a default constructor, this is why the call to V1.resize succeeds. If you provide one for foo as well, or allow its implicit generation by in class initialization, e.g.



struct foo

{

const int first = 42;

int second = 43;

};



then



std::vector<foo> V2;

V2.resize(3);



will happily compile. The operation that won't work out for both std::pair<const int, int> and foo is assignment. This won't compile:



V1[0] = std::pair<const int, int>(42, 43); // No way

V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member



which doesn't have anything to do with std::vector, but with the const-qualified data members in both cases.









share|improve this answer



















































  • Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



    – StoryTeller

    49 mins ago























  • @StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



    – lubgr

    37 mins ago


























13






















13














13










You are mixing two things here. The error that you get is due to the implicitly deleted foo() default constructor that std::vector::resize(size_type count) invokes:




If the current size is less than count,

1) additional default-inserted elements are appended




The std::pair template has a default constructor, this is why the call to V1.resize succeeds. If you provide one for foo as well, or allow its implicit generation by in class initialization, e.g.



struct foo

{

const int first = 42;

int second = 43;

};



then



std::vector<foo> V2;

V2.resize(3);



will happily compile. The operation that won't work out for both std::pair<const int, int> and foo is assignment. This won't compile:



V1[0] = std::pair<const int, int>(42, 43); // No way

V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member



which doesn't have anything to do with std::vector, but with the const-qualified data members in both cases.









share|improve this answer




























You are mixing two things here. The error that you get is due to the implicitly deleted foo() default constructor that std::vector::resize(size_type count) invokes:




If the current size is less than count,

1) additional default-inserted elements are appended




The std::pair template has a default constructor, this is why the call to V1.resize succeeds. If you provide one for foo as well, or allow its implicit generation by in class initialization, e.g.



struct foo

{

const int first = 42;

int second = 43;

};



then



std::vector<foo> V2;

V2.resize(3);



will happily compile. The operation that won't work out for both std::pair<const int, int> and foo is assignment. This won't compile:



V1[0] = std::pair<const int, int>(42, 43); // No way

V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member



which doesn't have anything to do with std::vector, but with the const-qualified data members in both cases.









share|improve this answer

























share|improve this answer



share|improve this answer










edited 1 hour ago







































answered 1 hour ago













lubgrlubgr



13.7k31952







13.7k31952
























  • Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



    – StoryTeller

    49 mins ago























  • @StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



    – lubgr

    37 mins ago



































  • Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



    – StoryTeller

    49 mins ago























  • @StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



    – lubgr

    37 mins ago




























Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



– StoryTeller

49 mins ago









Isn't it also related to that fact that in C++03 (the Q&A the OP quoted) the requirements were container-wide, while now they are more member function specific?



– StoryTeller

49 mins ago





















@StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



– lubgr

37 mins ago









@StoryTeller Good question. Comparing the container requirements between two versions of the standard seems a bit above my pay grade, but I'll try to think about it :)



– lubgr

37 mins ago


































draft saved


draft discarded





















































































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





draft saved


draft discarded



















StackExchange.ready(

function () {

StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55218505%2fvector-of-pair-with-const-member%23new-answer', 'question_page');

}

);



Post as a guest




























Required, but never shown















































































Required, but never shown
























Required, but never shown




















Required, but never shown











Required, but never shown



















































Required, but never shown
























Required, but never shown




















Required, but never shown











Required, but never shown









Vector of pair with const member Rating: 4.5 Diposkan Oleh: Admin

0 komentar:

Posting Komentar

Popular Posts