Is it legal code?

P

Paul

Stuart Redmann said:
Agreed. However, there is a subtle difference between illegal code and
UB: Illegal code says that different compilers are not forced to
produce semantically equivalent machine code, whereas UB means that
different run-times may produce different results. While I consider
illegal code as something that must be avoided at all costs, I allow
for very, very few occurances of UB (for example casting a
std::vector<Derived*> to _const_ std::vector<Base*>).
Fair enough.



I'd opt for b).
I think this is very debateable.
I can understand your view if a function is thought of a set of instructions
in a block of memory, but a function can also be seen as a sub
process/routine
I usually think of a function as a sub-process, when thinking in this way it
seems inconceivable that a functions' lifetime can be the same as the
program (unless its the main function :)).

TY
Paul.
 
J

James Kanze

James Kanze said:
"James Kanze" <[email protected]> wrote in message
[...]
In practice, as someone else has pointed out in this thread, you
can take the address of a non-static member function, with or
without the presense of an object. Which seems like
a conclusive argument that whatever non-static member functions
might be, and whether they exist or not, their reality or status
or whatever is independent of any object.
I have pointed this out , but I aslo pointed out this would
not be standard complaint. I disagree with your analysis,
I think the standard defines a rule that means a function
cannot exists without an object, the opposite of your
conclusion.
So what am I taking the address of, when I take its address.
You are in a gray area where you have a pointer to a functions
definition, but you can't invoke the function, so does the
function exist?

It depends on your definition of "exists", I suppose. But the
issue is not restricted to non-static member functions; the same
question could be asked of any function which requires an lvalue
(and thus an object). Given:

struct Toto
{
void titi();
};
void tata(Toto&);

, what is the existential difference between Toto::titi and
tata?
Its the address InstrPointer will point to when the the function is
invoked. (for an assumed machine architecture).

The pointer already exists, and has a fixed value. What does it
mean to be the address something will point to when the function
is called?
&Toto::titi is the location where the function is defined.

It's the address of the function. As far as the standard is
concerned, there is no "location".
No there are two pointers.
Toto::titi is part of the class/object-type defiition, there is only one
definiton for all instances of this class/object-type.
(whether this is guaranteed to be the case on all implementations, I think
is undefined).
Note: I am not talking about breaking the one definition rule , I am
thinking of possible implementations of virtual functions.> }
If you are going to give a function a lifetime then consider
a function as a sub-process. What is the lifetime of that
sub-process? It seems stupid to speak about the lifetime of
a function, where every function has the same lifetime(that of
program execution).

But that's the only way you can speak about it and be conform
with what the standard says. C++0x doesn't link functions with
threads (I presume that's what you mean by "sub-process") any
more than it links them to objects. A member function is
a function like any other, except that it has a special calling
syntax, and special access rights to member data.
The rules suggest that a NSMF cannot be called unless called
on an object. This supports my argument that C++ supports the
OOP concept that NSMF's are members of an object.

The rules say explicitly that *no* function, member or
otherwise, can be called without being passed valid arguments.
Any function taking a reference requires an object. There's
nothing special about member functions here.
If you are suggesting C++ does not support OOP, this seems
like a pretty bold statement to make considering the
overwhelming evidence to suggest otherwise. I don't see how
you can brush this of as 'purely lexical'.

I'm not sure what you mean by "supporting OOP". C++ provides
adequate support for OOP, and for a number of other paradigms as
well. But the usual language of OOP doesn't talk about members
of objects (at least not in OOP languages with static
typechecking); it talks about members of classes; Java, for
example, has class members (§8.2 of the Java specification), not
object members. It's frequent as well to use the term "members
of an object" as a shorthand for "members of the object's type",
but this is just that, a shorthand.
No I can find hundreds of quotes to support me, the fact that
nobody in here seems to be speaking up against the majority(in
here) doesn't mean you are the real majority.

And where do you find those quotes? I can't find them, and I've
read quite a bit of the OO literature. None of my collegues,
past or present, describe things in terms you use, and that
represents a lot of very competent people.
You and a few other in here have claimed that a NSMF is
a member of a class but not an object. You have given no
evidence at all to support your claim except for the fact that
you are in the majority therefore you are correct.

We cite other uses, such as that of the C++ standard. (I've
also cited the Java standard, just to prove that it's not
a particularity of C++.) As we are clearly in the majority
here, and in the majority in the C++ committee, it's up to you
to find support elsewhere---in which case, the best you can do
is prove that the use is ambiguous; that different communities
use the language differently.
C++ is a language where the class is the definition of an
object, so to say something is a member of a class but not
part of an object doesn't make sense, bar the exception of
static members.

No. A class is not the definition of an object, neither in C++
nor in Java (the other "OO" language I know well). A class is
a definition of a type, and an object has a type---in C++, that
type is not even necessarily a class type.

Note the distinction---it's a typically OO one between isA
(a class isA type) and containment (an object hasA type). In
many (most?) OO languages, each type is represented by a specific
object, but this is not the case of C++, and it is still
a distinct object, with its own type, and not the object which
has the type.
Member functions as part of an object are a well defined OOP
concept

It's such a well defined concept that I can find no mention of
it in the literature. A quick search for member functions turns
up:
-- Member functions are operators and functions that are
declared as members of a class. (IBM)
-- Classes can contain data and functions. These functions are
referred to as "member functions." (Microsoft)
and so on.
and if a language doesn't support this, it cannot be
said to support OOP.

In which case, I know of no language which supports OOP. The
Java specification makes the distinction even clearer than the
C++ one.
However C++ does support OOP so therefore
it follows that C++ supports the concept of member functions
as members of an object. The argument you have put forward is
very non supportive of OOP, and if your argument was correct
it would mean C++ did not support OOP.

For starters, you've got things backwards. C++ has a set of
functionalities; it is this set which can be used to determine
whether C++ supports OOP or not (and some prominent
practitioners---Bertrand Meyers for examnple---have proclamed
that it doesn't). Whether a feature is OOP or not has no
influence on the language---only on how you view the language.
Can you at least agree that a language must support this
concept to support OOP?

No, since Java explicitly doesn't, and Java is definitly OOP
(and not much else).
 
P

Paul

Can you at least agree that a language must support this concept to
support
OOP?- Hide quoted text -

And what would be your definition of OOP?

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Object Orientated Programming.

I guess you are looking for a more detailed answer but I don't know what to
say TBH. I think there are differing opinions about some OOP concepts. But
there are some concepts that are generally agreed on, member functions as
members of an object is one of the generally agreed upon concepts IMHO.
 
I

itaj sherman

Object Orientated Programming.

I guess you are looking for a more detailed answer but I don't know what to
say TBH. I think there are differing opinions about some OOP concepts. But
there are some concepts that are generally agreed on, member functions as
members of an object is one of the generally agreed upon concepts IMHO.

And what is the meaning of the word "member" in this?
I'm sure it's not the same as any of the 3 different meanings (at
least) of the word "member" in of the following c++ definitions: data
member, static data member, function member, static function member.
 
J

James Kanze

On 20/02/2011 21:44, Paul wrote:
[...]
In C++ a member function is a member of a class not
a member of an object; in C++ an object is simply
a region of storage; in C++ a non-static member function
is *invoked* on an object it is not part of an object.
In C++, an object is a *contiguous* region of storage. Each
object has a distinct address.
C++ also requires pointer to member functions to compare equal
if they point to the same function. So member functions cannot
be members of an object; they must have an existance outside of
the object.
They do have an existence outside objects, but their existence
outwith an object is undefined.
And what does "existence [..] is undefined" mean?
I actually covered two things by this:
1)The existence/lifetime of a function is a gray area and is undefined.
2)When a function is invoked on an object its behaviour is defined,
otherwise it is undefined.

I don't think that there's any disagreement there. But there is
no difference between member functions and free functions in
either case.
What you say above seems illogical to me i.e the following are incoherent.:
1) a class type is a subset of all possible types
2) object type is a larger subset, int is not a class type.
How can you get larger subset than *all possible* types?

Class types are a subset of all possible subsets. Object types
are a subset of all possible subsets. The cardinality of
"object types" is larger than the cardinality of "class types".
Thus, if I write:
class Toto {};
typedef int Titi;
typedef void Tata(); // (And yes, this is legal. Even if
// I've never found a use for it.)
Then Toto, Titi and Tata are names of types: all three are in
the set of all possible types. Toto and Titi are object types,
and only Toto is a class type.
IMO the standards loose use of the word 'object' to mean
almost anything imaginable is confusing.

It doesn't use it to mean almost anything. It uses "object" for
a specific set of types, which have instances guaranteed to be
represented as a contiguous set of bytes in memory.
Everytime I use the word now I feel the need to follow it with
a bracketed description to define my meaning(which is normally
an instance of class-type).
.>> *It's not simply a class member because this terminology is

Not that Wikipedia is a reference, but it does reflect the
vocabulary used by at least some practitioners...

The article in question talks about "class variable", and
compares it with "instance variable". There's nothing in it
which says that "instance variables" aren't members of a class;
it doesn't even speak of "members".

More generally, however, I have found some respectable sites
which do use your terminology. From an admittedly very quick
scan of the text, my impression is that people from a Smalltalk
background think in terms of objects having members (and don't
think much in terms of types at all); people from a Simula
background think in terms of classes having members (and are
very concerned about types). Stroustrup, of course, studied
with the creators of Simula, and has long cited Simula as his
major source, along side of C. And types are a very important
concept in C++. So the Simula vocabulary seems more
appropriate. Also, most people from the Smalltalk school deny
C++, and even Java, the qualification of an OOP language. And
also, they don't talk about functions, period---functions don't
exist in Smalltalk, only methods, which are members of the
object (since there isn't any type system in the sense we
understand it in C++), and react to messages.

Anyway, that's not the way most people speak about C++.
Curiously enough, a lot more Java experts use the term "members
of an object", despite the Java standard very explicitly
describing members as "of a class". My experience is largely
C++ (with some Java), so I use the vocabulary that is current in
the C++ community, and especially in the C++ standards
committee. When talking about C++, it certainly facilitates
communication. (Maybe part of your problem is that you consider
C++ an OOP language, while using a vocabulary generally used by
people who don't consider C++ OOP.)
 
P

Paul

This is too long a post to manually indent everything. Please re-raise any
issues if you think I am trying to avoid anythingBut when you see what i have to post you will realise I am not avoiding
anything.
You are in a gray area where you have a pointer to a functions
definition, but you can't invoke the function, so does the
function exist?

It depends on your definition of "exists", I suppose. But the
issue is not restricted to non-static member functions; the same
question could be asked of any function which requires an lvalue
(and thus an object). Given:

struct Toto
{
void titi();
};
void tata(Toto&);

, what is the existential difference between Toto::titi and
tata?


Its the address InstrPointer will point to when the the function is
invoked. (for an assumed machine architecture).

The pointer already exists, and has a fixed value. What does it
mean to be the address something will point to when the function
is called?
&Toto::titi is the location where the function is defined.

It's the address of the function. As far as the standard is
concerned, there is no "location".
No there are two pointers.
Toto::titi is part of the class/object-type defiition, there is only one
definiton for all instances of this class/object-type.
(whether this is guaranteed to be the case on all implementations, I think
is undefined).
Note: I am not talking about breaking the one definition rule , I am
thinking of possible implementations of virtual functions.> }
If you are going to give a function a lifetime then consider
a function as a sub-process. What is the lifetime of that
sub-process? It seems stupid to speak about the lifetime of
a function, where every function has the same lifetime(that of
program execution).

But that's the only way you can speak about it and be conform
with what the standard says. C++0x doesn't link functions with
threads (I presume that's what you mean by "sub-process") any
more than it links them to objects. A member function is
a function like any other, except that it has a special calling
syntax, and special access rights to member data.Here I am speaking about a function as a sub-routine or sub-process, I'm not
talking about thread processes.

Please note your final sentence in the above paragraph. Its a contradiction
in terms. You state that a member function is like any normal function
except......blah blah. This means its not the same as a normal function. I
would refer back to this in the many instances where you suggest there is
nothing special about member functions, if it weren't for my skipping over
because of indenting probs.
The rules suggest that a NSMF cannot be called unless called
on an object. This supports my argument that C++ supports the
OOP concept that NSMF's are members of an object.

The rules say explicitly that *no* function, member or
otherwise, can be called without being passed valid arguments.
Any function taking a reference requires an object. There's
nothing special about member functions here.
If you are suggesting C++ does not support OOP, this seems
like a pretty bold statement to make considering the
overwhelming evidence to suggest otherwise. I don't see how
you can brush this of as 'purely lexical'.

I'm not sure what you mean by "supporting OOP". C++ provides
adequate support for OOP, and for a number of other paradigms as
well. But the usual language of OOP doesn't talk about members
of objects (at least not in OOP languages with static
typechecking); it talks about members of classes; Java, for
example, has class members (§8.2 of the Java specification), not
object members. It's frequent as well to use the term "members
of an object" as a shorthand for "members of the object's type",
but this is just that, a shorthand.<quote ref =http://java.sun.com/docs/glossary.html#O>
"object
The principal building blocks of object-oriented programs. Each object is a
programming unit consisting of data (instance variables) and functionality
(instance methods). See also class."
</quote>

I have nothing more to say about your above paragraph except.. complete
rubbish.
No I can find hundreds of quotes to support me, the fact that
nobody in here seems to be speaking up against the majority(in
here) doesn't mean you are the real majority.

And where do you find those quotes? I can't find them, and I've
read quite a bit of the OO literature. None of my collegues,
past or present, describe things in terms you use, and that
represents a lot of very competent people.
..>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

One above and here's another, there are hundreds if not thousands:

http://en.wikipedia.org/wiki/Object-oriented_programming
You and a few other in here have claimed that a NSMF is
a member of a class but not an object. You have given no
evidence at all to support your claim except for the fact that
you are in the majority therefore you are correct.

We cite other uses, such as that of the C++ standard. (I've
also cited the Java standard, just to prove that it's not
a particularity of C++.) As we are clearly in the majority
here, and in the majority in the C++ committee, it's up to you
to find support elsewhere---in which case, the best you can do
is prove that the use is ambiguous; that different communities
use the language differently."We"? Are you skitzo, or royal?
You are speaking nonsense James, see my quote from Java above.

<snip rest>
 
I

itaj sherman

Object Orientated Programming.

I guess you are looking for a more detailed answer but I don't know what to
say TBH. I think there are differing opinions about some OOP concepts. But
there are some concepts that are generally agreed on, member functions as
members of an object is one of the generally agreed upon concepts IMHO.

Whatever your definitions mean.
The following section of the standard is very clear about the
definitions of all members in c++ (and whether they are members of the
class or something else):

9.2/1 The member-specification in a class definition declares the full
set of members of the class; no member can be added elsewhere. Members
of a class are data members, member functions (9.3), nested types, and
enumerators. Data members and member functions are static or non-
static; see 9.4. Nested types are classes (9.1, 9.7) and enumerations
(7.2) defined in the class, and arbitrary types declared as members by
use of a typedef declaration (7.1.3). The enumerators of an unscoped
enumeration (7.2) defined in the class are members of the class.
Except when used to declare friends (11.4) or to introduce the name of
a member of a base class into a derived class (7.3.3, 11.3), member-
declarations declare members of the class, and each such member-
declaration shall declare at least one member name of the class. A
member shall not be declared twice in the member-specification, except
that a nested class or member class template can be declared and then
later defined, and except that an enumeration can be introduced with
an opaque-enum-declaration and later redeclared with an enum-
specifier.

When we converse about c++ here we stick to these definitions and any
others in the standard because we want to understand each other
easily.
If you want to talk about different things you have to choose another
name that is not used by already existing defintions (in the
standard), and explain very clearly what your definition is. For all I
care you can call it x-member.
Also, you will be expected to show what your definitions are
beneficial for, if you want anyone to consider them seriously.

* BTW, I do think that the word "member" in any of these does not
stand by itself, because it has a slightly different meaning between
them. However it makes no difference for anything we talked about.

itaj
 
P

Paul

Object Orientated Programming.

I guess you are looking for a more detailed answer but I don't know what
to
say TBH. I think there are differing opinions about some OOP concepts. But
there are some concepts that are generally agreed on, member functions as
members of an object is one of the generally agreed upon concepts IMHO.

And what is the meaning of the word "member" in this?
I'm sure it's not the same as any of the 3 different meanings (at
least) of the word "member" in of the following c++ definitions: data
member, static data member, function member, static function member.

Can you jump to the point please because my newsreader aint indenting and
its a pain , if you have something form the standard you think suggests C++
doesn't suport OOP then please post the relevant quote.
 
I

itaj sherman

Can you jump to the point please because my newsreader aint indenting and
its a pain , if you have something form the standard you think suggests C++
doesn't suport OOP then please post the relevant quote.

get out.
 
I

itaj sherman

Whatever your definitions mean.
The following section of the standard is very clear about the
definitions of all members in c++ (and whether they are members of the
class or something else):

I guess c++ is not OOP as far as you're concerned. You shouldn't be
learning it anymore.

itaj
 
I

Ian Collins

I have to admit it does say type , but this misunderstanding is due to
your innapporiopriate snipping of my original quote.

Hang on, you quote a section of the standard then blame me snipping it
for your misunderstanding? When you are in a hole, the time comes to
stop digging.
However this does not make your program valid, that was only one of many
arguments I have against your program.

What is the definition of valid?
You produce UB prior to invokation of the member function, to suggest
that the results of UB is standard compliant code is nonsense.

So which constraint does the code violate?
 
P

Paul

James Kanze said:
On 20/02/2011 21:44, Paul wrote:
[...]
In C++ a member function is a member of a class not
a member of an object; in C++ an object is simply
a region of storage; in C++ a non-static member function
is *invoked* on an object it is not part of an object.
In C++, an object is a *contiguous* region of storage. Each
object has a distinct address.
C++ also requires pointer to member functions to compare equal
if they point to the same function. So member functions cannot
be members of an object; they must have an existance outside of
the object.
They do have an existence outside objects, but their existence
outwith an object is undefined.
And what does "existence [..] is undefined" mean?
I actually covered two things by this:
1)The existence/lifetime of a function is a gray area and is undefined.
2)When a function is invoked on an object its behaviour is defined,
otherwise it is undefined.

I don't think that there's any disagreement there. But there is
no difference between member functions and free functions in
either case.
Good this one is indenting :-S

There is a difference , you are trying implement standaresque language which
is confusing.
A NSMF must be called on an object(instance of class type object) , this is
not the same as calling a normal function with an int object(confusing
standaresque object) argument.
Class types are a subset of all possible subsets. Object types
are a subset of all possible subsets.
The above states exactly the same thing for both class and object types.
The cardinality of
"object types" is larger than the cardinality of "class types".
Thus, if I write:
class Toto {};
typedef int Titi;
typedef void Tata(); // (And yes, this is legal. Even if
// I've never found a use for it.)
Then Toto, Titi and Tata are names of types: all three are in
the set of all possible types. Toto and Titi are object types,
and only Toto is a class type.



It doesn't use it to mean almost anything. It uses "object" for
a specific set of types, which have instances guaranteed to be
represented as a contiguous set of bytes in memory.
So, barring functions, what isn't an object in the context of the standards?
As I said it seems that almost everything is an object according to the
standards.

Not that Wikipedia is a reference, but it does reflect the
vocabulary used by at least some practitioners...

The article in question talks about "class variable", and
compares it with "instance variable". There's nothing in it
which says that "instance variables" aren't members of a class;
it doesn't even speak of "members".
I'm not trying to say instance members aren't members of the class. I
acknowledge the class/object(not in the ISO std context) relationship.
A member declared in a class , is *also* a member of an object instanciated
from that class, and vice versa, with the exception of class variables
declared static.

As the above link explains class methods/variables is a term usually applied
to member functions/variables that are declared static. A nonstatic
memberfuncion/variable is different altogether.
More generally, however, I have found some respectable sites
which do use your terminology. From an admittedly very quick
scan of the text, my impression is that people from a Smalltalk
background think in terms of objects having members (and don't
think much in terms of types at all); people from a Simula
background think in terms of classes having members (and are
very concerned about types). Stroustrup, of course, studied
with the creators of Simula, and has long cited Simula as his
major source, along side of C. And types are a very important
concept in C++. So the Simula vocabulary seems more
appropriate. Also, most people from the Smalltalk school deny
C++, and even Java, the qualification of an OOP language. And
also, they don't talk about functions, period---functions don't
exist in Smalltalk, only methods, which are members of the
object (since there isn't any type system in the sense we
understand it in C++), and react to messages.
'Methods' and 'member functions' are generally considered interchangeable
when talking about OOP across languages.

As per Stroustrup I can produce quotes, and I have in the past, from his
documents on OOP which support my argument , please read these docs.
Anyway, that's not the way most people speak about C++.
Curiously enough, a lot more Java experts use the term "members
of an object", despite the Java standard very explicitly
describing members as "of a class".

This is completely incorrect see my other post where I posted the definition
of an object from the Java sun docs.
My experience is largely
C++ (with some Java), so I use the vocabulary that is current in
the C++ community, and especially in the C++ standards
committee. When talking about C++, it certainly facilitates
communication. (Maybe part of your problem is that you consider
C++ an OOP language, while using a vocabulary generally used by
people who don't consider C++ OOP.)

C++ supports OOP, its debatable what *is* a true OOP language , so C++ seems
unsure if it is or not. But it most certainly supports it.

If you read Bjarnes OOP papers you will see all the details of what a
language should implement in order to support OOP techniques, in Bjarnes
Opinion. I think this is probably the most relevant and certainly a highly
respected document to reference.
 
P

Paul

Whatever your definitions mean.
The following section of the standard is very clear about the
definitions of all members in c++ (and whether they are members of the
class or something else):

---I guess c++ is not OOP as far as you're concerned. You shouldn't be
---learning it anymore.

Taking your other post into consideration.
Are you suggesting that nonstatic members of a class are not also members of
an object(instance of the class)?

Are you in the 'class has no relation to object(not in the std context)'
group?
 
P

Paul

Who said it was?


Now your inexperience is showing; a function does not exist on the stack
at all; all that exists on the stack is stack data such as function
parameters; locals and return addresses. How can a function exist in a
register? That is plain nonsense. You need to learn assembler and how
compilers actually work.

Please show the asm code for a function that does not use the stack or any
cpu registers.
I predict it won't happen!
Functions only exist as machine code in the text segment; inlined
functions exist as machine code in the calling function in the text
segment.
The repetition of your incorrect statement won't make it correct.
It obvious to all who is the "n00b" here.
Yeah it is , you are.
 
I

itaj sherman

---I guess c++ is not OOP as far as you're concerned. You shouldn't be
---learning it anymore.

Taking your other post into consideration.

I don't think you did.
Are you suggesting that nonstatic members of a class are not also membersof
an object(instance of the class)?

I'm not sure I managed to achieve this conclusion.
Can you explain how what I said implies that?
Are you in the 'class has no relation to object(not in the std context)'
group?

I'm with everyone. I'm only trying to figure out what is a
"definition".
I'm a free mind floating through comp.lang.c++

itaj
 
I

itaj sherman

Whatever your definitions mean.
The following section of the standard is very clear about the
definitions of all members in c++ (and whether they are members of the
class or something else):

9.2/1 The member-specification in a class definition declares the full
set of members of the class; no member can be added elsewhere. Members
of a class are data members, member functions (9.3), nested types, and
enumerators. Data members and member functions are static or non-
static; see 9.4. Nested types are classes (9.1, 9.7) and enumerations
(7.2) defined in the class, and arbitrary types declared as members by
use of a typedef declaration (7.1.3). The enumerators of an unscoped
enumeration (7.2) defined in the class are members of the class.
Except when used to declare friends (11.4) or to introduce the name of
a member of a base class into a derived class (7.3.3, 11.3), member-
declarations declare members of the class, and each such member-
declaration shall declare at least one member name of the class. A
member shall not be declared twice in the member-specification, except
that a nested class or member class template can be declared and then
later defined, and except that an enumeration can be introduced with
an opaque-enum-declaration and later redeclared with an enum-
specifier.

When we converse about c++ here we stick to these definitions and any
others in the standard because we want to understand each other
easily.
If you want to talk about different things you have to choose another
name that is not used by already existing defintions (in the
standard), and explain very clearly what your definition is. For all I
care you can call it x-member.
Also, you will be expected to show what your definitions are
beneficial for, if you want anyone to consider them seriously.

Paul, why don't you be the man and reply on this one?
 
I

Ian Collins

I

Ian Collins

Functions only exist as machine code in the text segment; inlined
functions exist as machine code in the calling function in the text
segment.

If you stopped using such system specific terms as *the* text segment,
this argument would evaporate.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,781
Messages
2,569,619
Members
45,316
Latest member
naturesElixirCBDGummies

Latest Threads

Top